2010-01-18 16 views
5

Me gustaría saber cómo puedo determinar si una secuencia de comandos python se ejecuta desde crontab?¿Cómo puedo determinar si un script de python se ejecuta desde crontab?

No quiero una solución que requiera agregar un parámetro porque quiero ser capaz de detectar esto incluso desde un módulo importado (no el script principal).

+2

¿por qué le gustaría saber esto? – SilentGhost

+1

Por ejemplo, quiero cambiar la forma en que hace la salida. Cuando se ejecuta desde la terminal, quiero usar el color a través de secuencias de escape ANSI, pero cuando se ejecuta desde la terminal, deseo texto sin formato para recibir correos electrónicos agradables. – sorin

+3

Luego verifique la terminal, no para cron. – digitalarbeiter

Respuesta

19

No es exactamente lo que pidió, pero tal vez lo que quiere es os.isatty(sys.stdout.fileno()), que indica si stdout está conectado (en términos generales) a un terminal. Será falso si canaliza la salida a un archivo u otro proceso, o si el proceso se ejecuta desde cron.

+1

+1 Esto sería lo correcto si desea obtener resultados diferentes en función de si está enviando a la 'pantalla' o no. –

+3

** 'sys.stdout.isatty()' ** es más sencillo que 'os.isatty (sys.stdout.fileno())'. –

7

Compruebe su PPID: la ID de su proceso principal. Compare eso con el cron pid; Si son iguales, fue invocado por el crontab.

Esto se puede hacer por:

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

El PID del proceso de cron en este ejemplo es 6363. Vale la pena mencionar que el PPID de cron es de 1 - the init process.

ahora ¿cuál es el PID de su programa de Python:

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

que su PID y PPID 12992 es 6363, por lo que era de hecho invocadas por el proceso de cron.

EDIT:

El proceso de cron no podría invocar el proceso directamente. Por lo tanto, tendrá que atravesar los PPID de su proceso hacia arriba, hasta llegar a PPID = 1 o PPID = /usr/sbin/cron's PID. Esto se puede hacer fácilmente usando un pequeño script de shell o python; simplemente analizar la salida de ps:

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

El siguiente paso sería checkig/proc/7238, y así sucesivamente. Nuevamente, esto es realmente fácil de implementar usando script de shell o python.

Gracias, @digitalarbeiter y @Noufal Ibrahim por señalarlo en sus comentarios.

+3

cron ejecutará su entrada de crontab en un nuevo shell, que sería el PPID de su secuencia de comandos de Python. Deberá comparar el PPID del PPID. – digitalarbeiter

+2

Esto supone que el padre (cron) generó directamente el hijo sin un shell o algo más en el medio. No siempre es verdad –

4

Establezca una variable de entorno en la invocación del comando cron. Eso funciona incluso dentro de un módulo, ya que solo puede marcar os.getenv().

2

Una solución más fácil sería pasar una bandera al script solo desde el crontab, como --crontab, y luego simplemente verificar esa marca.

+2

yup pero él no quiere hacer eso. –

0

Si desea detectar esto desde un módulo importado, el programa principal establecería una variable global en el módulo, que arrojaría resultados diferentes según el valor de esta variable global (y haría que el programa principal decida cómo para establecer la variable a través de un indicador que usaría en su crontab). Esto es bastante sólido (en comparación con el estudio de los PPID).

Cuestiones relacionadas