Существует ли способ определить, что скрипт запускается как в задании вместо в интерактивном режиме от оболочки пользователем?
Некоторые наши сценарии имеют защиту, чтобы проверить, работают ли они на экране путем проверки $TERM. Я пытаюсь выяснить, могу ли я разумно проверить, как выполнение сценария инициировалось так, я могу обновить тот защитный оператор ИЛИ если я должен добавить опцию, которая должна всегда включаться, когда выполнено от в задании.
Включить ведение журнала для подсистем выполнения заданий. В частности, cron и at will по умолчанию записываются в системный журнал, поэтому вам просто нужно убедиться, что зарегистрированные события сохраняются. Возможно, вы захотите добавить следующее в свой /etc/syslog.conf
## Log cron and at to /var/adm/scheduled.log cron.* /var/adm/scheduled.log
. После добавления перезагрузите демон syslog, чтобы он принял недавно добавленные параметры конфигурации. На этом этапе у вас есть запись о запланированных заданиях, которые были запущены, и вы можете сравнить задание с записью о его выполнении. [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» или «at» или "пакетные" команды.
1: Обратите внимание, звездочка означает ведение журнала на уровне отладки, которое может быть очень подробным. Если журналы заполняются информацией, не требующей действий, вы можете заменить "*" на "info"
Вы можете проверить имя родительского процесса, используя переменную среды $ {PPID} и найдя ее в ps.
Другой вариант - использование pstree
$ pstree -lp | grep crond
|-crond(2059)-+-crond(4445)---sh(4452)
| `-crond(4446)---sh(4453)
В этом случае оба PID 4452 и 4453 являются скриптами, которые были запущены через crond.
.