Есть ли способ определить, что скрипт запускается как задание, а не интерактивно из оболочки пользователем?
У некоторых из наших скриптов есть защита, которая проверяет, работают ли они на экране, проверяя $ 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".