Назад | Перейти на главную страницу

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

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

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

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

Другой вариант - использовать pstree

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

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

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

## Log cron and at to /var/adm/scheduled.log
cron.*  /var/adm/scheduled.log 

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

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

unlink /tmp/schedulereport ;
cat /etc/passwd |while read ROW ; do 
  LOGIN="$(echo ${ROW} |cut -d: -f1)" ; 
  SHELL="$(echo ${ROW} |cut -d: -f7)" ; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && ATJOBS='Skipping AT queue for non-interactive user' \
    || ATJOBS="$(su - ${LOGIN} -c 'atq' 2>/dev/null)" ; 
  [[ "${SHELL}" == '/sbin/nologin' && "${SHELL}" == '/bin/false' ]] \
    && CRONJOBS='Skipping CRON queue for non-interactive user' \
    || 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='' ;
done

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


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