Можно ли определить, запускается ли работа как на рабочем месте (запускается через atd/cron)?

Есть ли способ определить, что сценарий запускается пользователем как на рабочем месте, а не в интерактивном режиме из оболочки?

У некоторых наших скриптов есть защита, чтобы проверить, работают ли они на экране, проверяя $TERM. Я пытаюсь выяснить, могу ли я разумно проверить, как было инициировано выполнение сценария, чтобы я мог обновить это защитное выражение ИЛИ если мне нужно добавить параметр, который всегда должен быть включен при запуске из задания at.

3 ответа

Вы можете проверить имя родительского процесса, используя переменную среды ${PPID} и ища это в ps.

Другой вариант заключается в использовании pstree

$ pstree -lp | grep crond
        |-crond(2059)-+-crond(4445)---sh(4452)
        |             `-crond(4446)---sh(4453)

В этом случае PID 4452 и 4453 являются скриптами, которые были запущены через crond.

Включите ведение журнала для подсистем выполнения задания. В частности, cron и at будут регистрироваться в syslog по умолчанию, поэтому вам просто нужно убедиться, что зарегистрированные события сохраняются. Вы можете добавить следующее в ваш /etc/syslog.conf

## Зарегистрируйте cron и перейдите в /var/adm/scheduled.log
cron.*  /var/adm/scheduled.log 

После добавления перезагрузите демон syslog, чтобы он выбрал только что добавленные параметры конфигурации. В этот момент у вас есть запись запланированных заданий, которые были выполнены, и вы можете сравнить задание с записью о его выполнении. [1]

Чтобы проверить расписания всех пользователей на определенный момент времени, вы можете сделать следующее: список их заданий будет указан в отчете по адресу / tmp / schedulereport.

unlink /tmp/schedulereport;
cat /etc/passwd | пока читается ROW; делать 
  LOGIN="$(echo ${ROW} |cut -d: -f1)"; 
  SHELL="$(echo ${ROW} |cut -d: -f7)"; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && ATJOBS='Пропуск очереди AT для неинтерактивного пользователя' \
    || ATJOBS="$(su - ${LOGIN} -c 'atq' 2>/dev/null)"; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && CRONJOBS='Пропуск очереди CRON для неинтерактивного пользователя' \
    || CRONJOBS="$(su - ${LOGIN} -c 'crontab -l' 2>/dev/null)"; 
  echo -e "${LOGIN}:\nAT:\n${ATJOBS}\n\nCRON:\n${CRONJOBS}\n\n=====\n >>/tmp/schedulereport "; 
  ATJOBS='';
  CRONJOBS='';
сделанный

Конечно, если вы хотите запретить пользователям, которые не авторизованы, планировать задания, вы можете добавить только авторизованных пользователей в "cron.allow" и "at.allow", и все пользователи, не перечисленные в списке, не смогут запускать "crontab". Команды "или" at "или" batch ".


1: Обратите внимание, что звездочка означает ведение журнала на уровне отладки, которое может быть очень подробным. Если журналы заполнены неактивной информацией, вы можете заменить "*" на "info"

Другие вопросы по тегам