Действительно ли возможно определить, запускается ли задание как в задании (начался через фактическое время отправления/крон)?

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

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

3
задан 4 December 2014 в 04:06
3 ответа

Включить ведение журнала для подсистем выполнения заданий. В частности, 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"

0
ответ дан 3 December 2019 в 07:28

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

1
ответ дан 3 December 2019 в 07:28

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

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

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

.
0
ответ дан 3 December 2019 в 07:28

Теги

Похожие вопросы