Можно ли определить, запускается ли работа как на рабочем месте (запускается через 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"