Я хотел бы знать, как я могу определить, выполняется ли сценарий Python от crontab?
Я не хочу решения, которое потребует добавления параметра, потому что я хочу смочь обнаружить это даже от импортированного модуля (не основной сценарий).
Не совсем то, что вы спросили, но, возможно, то, что вы хотите, это OS.ISATTY (SYS.STDOUT.FILENO ())
, который рассказывает ли STDOUT
подключен к (грубо говоря) терминал. Это будет ложным, если вы передаете вывод в файл или другой процесс, или если процесс запускается из CRON.
Проверьте свой PPID - ID его родительского процесса. Сравнить это к Cron PID; Если они одинаковы, он был вызван Crontab.
Это может быть сделано:
$ sudo ps -Af | grep cron | grep -v grep
root 6363 1 0 10:17 ? 00:00:00 /usr/sbin/cron
PID процесса CRON в этом примере составляет 6363. Стоит отметить, что PPID CRON является 1 - Процесс init .
Теперь выясните, что такое PID вашей программы Python:
$ sudo ps -Af | grep SorinSbarnea.py
adam 12992 6363 1 12:24 pts/2 00:04:21 /usr/bin/python SorinSbarnea.py
его PID составляет 12992, а PPID составляет 6363, поэтому он был действительно вызываемым процессом CRON.
Редактировать:
Процесс CRON может не вызывать ваш процесс напрямую. Следовательно, вам придется пересекать PPIDS из вашего процесса вверх, до достижения PPID = 1 или PPID = / usr / sbin / cron
. Это может быть легко сделать с помощью небольшого скрипта оболочки или питона; Просто анализ выходов PS
:
$ cat /proc/12992/status
....
Pid: 12992
PPid: 7238
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
...
Следующий шаг будет проверяет / proc / 7238 и пр. Опять же, это действительно легко реализовать с помощью Shell или Python Script.
Спасибо, @DIGITALARBERBEITER и @NOUFAL IBRAHIM за то, что указываете на его комментарии.
Установите переменную окружения при вызове команды cron
. Это работает даже внутри модуля, так как вы можете просто проверить os.getenv()
.
Проще было бы передать флаг в скрипт только из кронтаба, как --crontab, а затем просто проверить на наличие этого флага.
Если вы хотите обнаружить это из импортируемого модуля, у меня будет иметь основную программу установить глобальную переменную в модуле, которая выводила бы разные вещи в зависимости от значения этой глобальной переменной (и принять решение о том, как Установите переменную через флаг, который вы использовали в вашем Crontab). Это довольно надежно (сравнивая с изучением PPIDS).