Как я могу определить, выполняется ли сценарий Python от crontab?

Я хотел бы знать, как я могу определить, выполняется ли сценарий Python от crontab?

Я не хочу решения, которое потребует добавления параметра, потому что я хочу смочь обнаружить это даже от импортированного модуля (не основной сценарий).

5
задан Jason Orendorff 18 January 2010 в 16:14
поделиться

5 ответов

Не совсем то, что вы спросили, но, возможно, то, что вы хотите, это OS.ISATTY (SYS.STDOUT.FILENO ()) , который рассказывает ли STDOUT подключен к (грубо говоря) терминал. Это будет ложным, если вы передаете вывод в файл или другой процесс, или если процесс запускается из CRON.

19
ответ дан 18 December 2019 в 05:36
поделиться

Проверьте свой 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 за то, что указываете на его комментарии.

7
ответ дан 18 December 2019 в 05:36
поделиться

Установите переменную окружения при вызове команды cron. Это работает даже внутри модуля, так как вы можете просто проверить os.getenv().

5
ответ дан 18 December 2019 в 05:36
поделиться

Проще было бы передать флаг в скрипт только из кронтаба, как --crontab, а затем просто проверить на наличие этого флага.

1
ответ дан 18 December 2019 в 05:36
поделиться

Если вы хотите обнаружить это из импортируемого модуля, у меня будет иметь основную программу установить глобальную переменную в модуле, которая выводила бы разные вещи в зависимости от значения этой глобальной переменной (и принять решение о том, как Установите переменную через флаг, который вы использовали в вашем Crontab). Это довольно надежно (сравнивая с изучением PPIDS).

0
ответ дан 18 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

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