2010-01-18 2 views
5

Я хотел бы знать, как определить, выполняется ли скрипт python из crontab?Как определить, выполняется ли скрипт python из crontab?

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

+2

Почему вы хотите это знать? – SilentGhost

+1

Например, я хочу изменить способ вывода. При работе с терминалом я хочу использовать раскраску через escape-последовательности ANSI, но при работе с терминалом я хочу простой текст, чтобы получать приятные электронные письма. – sorin

+3

Затем проверьте терминал, а не на cron. – digitalarbeiter

ответ

19

Не совсем то, что вы просили, но, возможно, вы хотите, чтобы os.isatty(sys.stdout.fileno()), который сообщает, что stdout подключен к терминалу (грубо говоря). Он будет ложным, если вы будете передавать вывод в файл или другой процесс или если процесс выполняется из cron.

+1

+1 Это было бы правильно, если вы хотите получить другой результат, исходя из того, выводите ли вы на «экран» или нет. –

+3

** 'sys.stdout.isatty()' ** более прямолинейно, чем 'os.isatty (sys.stdout.fileno())'. –

7

Проверьте его идентификатор PPID - идентификатор его родительского процесса. Сравните это с cron pid; Если они одинаковы, то это было вызвано crontab.

Это может быть сделано путем:

$ sudo ps -Af | grep cron | grep -v grep 
root 6363 1 0 10:17 ? 00:00:00 /usr/sbin/cron 

ПИД процесса хрон в этом примере 6363. Стоит отметить, что PPID Крон является 1 - the init process.

Теперь выяснить, что является PID вашего питона программы:

$ sudo ps -Af | grep SorinSbarnea.py 
adam 12992 6363 1 12:24 pts/2 00:04:21 /usr/bin/python SorinSbarnea.py 

Его ПИД-12992 и PPID является 6363, так что это был действительно вызван процессом хрон.

EDIT:

Процесс хрон не может ссылаться на свой процесс непосредственно. Следовательно, вам нужно будет пройти PPID от вашего процесса вверх до достижения PPID = 1 или PPID = /usr/sbin/cron PID. Это можно легко сделать, используя небольшой скрипт или скрипт python; просто разобрать выходе ps:

$ cat /proc/12992/status 
.... 
Pid: 12992 
PPid: 7238 
Uid: 1000 1000 1000 1000 
Gid: 1000 1000 1000 1000 
... 

Следующим шагом будет checkig/Proc/7238, и так далее. Опять же, это очень просто реализовать с использованием сценария оболочки или скрипта python.

Спасибо, @digitalarbeiter и @Noufal Ibrahim за то, что указали это в ваших комментариях.

+3

cron запустит вашу запись crontab в новой оболочке, которая будет PPID вашего скрипта Python. Вам нужно сравнить PPID PPID. – digitalarbeiter

+2

Предполагается, что родительский (cron) напрямую породил ребенка без оболочки или что-то еще между ними. Не всегда верно. –

4

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

2

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

+2

yup, но он не хочет этого делать. –

0

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

Смежные вопросы