Python Script no se ejecuta en cron

Estoy tratando de ejecutar un script de Python de cron. Estoy usando crontab para ejecutar el comando como usuario en lugar de root. Mi script en Python tiene el shebang en la parte superior #! /usr/bin/env python #! /usr/bin/env python e hice chmod +x it para hacer el script ejecutable.

El script funciona cuando se ejecuta desde un shell pero no cuando se usa crontab. Verifiqué el archivo /var/log/cron y vi que la secuencia de comandos se ejecuta pero que absolutamente nada de stdout o stderr imprime en cualquier lugar.

Finalmente, hice un pequeño script que imprime la fecha y una cadena y llamé a cada minuto que funcionó, pero este otro script no. No estoy seguro de por qué estoy obteniendo estos resultados variables …

Aquí está mi entrada en crontab

 SHELL=/bin/bash #min #hour day-of-month month day-of-week command #------------------------------------------------------------------------- */5 * * * * /path/to/script/script.py 

Aquí está el código fuente de mi script que no se ejecutará desde crontab sino que se ejecutará desde el shell en el que se encuentra cuando se lo llama así ./script.py . El script es ejecutable después de usar el comando chmod +x en él, por cierto …

 #! /usr/bin/env python #create a file and write to it import time def create_and_write(): with open("py-write-out.out", "a+") as w: w.write("writing to file. hello from python. :D\n") w.write("the time is: " + str(time.asctime()) + "\n") w.write("--------------------------------\n") def main(): create_and_write() if __name__ == "__main__": main() 

EDITAR Me di cuenta de lo que iba mal. Necesitaba poner las rutas de archivo absolutas en el script, de lo contrario se escribiría en algún directorio que no había planeado.

Puedes resolver esto tú mismo siguiendo estos pasos:

  1. Modifique el cron como /path/to/script/script.py > /tmp/log 2> &1
  2. Ahora, deja correr el cron
  3. Ahora lee el archivo /tmp/log
  4. Descubrirá el motivo del problema al que se enfrenta, para que pueda solucionarlo.

En mi experiencia, el problema es principalmente con el medio ambiente.
En cron, las variables env no están establecidas. Por lo tanto, es posible que tenga que establecer explícitamente el env para su script en cron.

Ok, supongo que este hilo todavía va a ayudar a los usuarios de Google.
Utilizo una solución para ejecutar scripts de python con trabajos cron. De hecho, los scripts de Python deben manejarse con delicado cuidado con el trabajo cron.
Así que dejo que un script de bash se encargue de todo.
Creo un script de bash que tiene el comando para ejecutar el script de Python. Luego programo un trabajo cron para ejecutar el script bash. Incluso puede usar un redirector para registrar la salida del comando bash que ejecuta la secuencia de comandos de python.
Por ejemplo

 @reboot /home/user/auto_delete.sh 

auto_delete.sh puede contener las siguientes líneas: –

 #!/bin/sh echo $(date) >> bash_cron_log.txt /usr/bin/python /home/user/auto_delete.py >> bash_cron_log.txt 

Así que no tengo que preocuparme por el locking de Cron Jobs en los scripts de Python.

Otra razón puede ser que la forma en que juzgamos ejecutado o no ejecutado es incorrecta.

Me gustaría enfatizar una cosa más. Estaba intentando ejecutar un script de Python en cron usando el mismo truco (usando un script de shell) y esta vez no se ejecutó. Fue @reboot cron. Así que utilicé la redirección en crontab como mencioné en uno de los comentarios anteriores. Y entendí el problema. Estaba usando muchos manejadores de archivos en el script de Python y cron ejecuta el script desde el directorio de inicio del usuario. En ese caso, Python no pudo encontrar los archivos utilizados para los manejadores de archivos y se bloqueará.

Lo que utilicé para solucionar problemas fue que creé un crontab como se muestra a continuación. Ejecutaría start.sh y lanzaría todo el stderror o stdoutput al archivo status.txt y obtuve un error en status.txt diciendo que no se encontró el archivo que usé para el manejador de archivos. Eso fue correcto porque el script de python fue ejecutado por cron desde el directorio de inicio del usuario y luego el script comienza a buscar archivos en el directorio de inicio solamente.

 @reboot /var/www/html/start.sh > /cronStatus/status.txt 2>&1 

Esto escribirá todo lo que sucede durante la ejecución cron en el archivo status.txt. Puedes ver el error allá. Volveré a recomendar la ejecución de scripts de python utilizando scripts de bash para cronjobs.

SOLUCIÓN: – O bien, utiliza la ruta completa para todos los archivos que se usan en el script (lo que no era factible para mí, ya que no quiero que el script dependa de la ubicación). O ejecutas el script desde el directorio correcto. Así que creé mi cron como abajo:

 @reboot cd /var/www/html/ && /var/www/html/start.sh 

Este cron primero cambiará el directorio a la ubicación correcta y luego iniciará el script. Ahora no tengo que preocuparme por la ruta completa de encoding para todos los archivos en el script. Sí, aunque puede parecer perezoso;)
Y mi start.sh se parece a

 #!/bin/sh /usr/bin/python /var/www/html/script.py 

Espero eso ayude
Saludos,
Kriss

Tuve un problema similar pero con un escenario un poco diferente: tuve un script bash ( run.sh ) y un script Python ( hello.py ). Cuando escribi

 sh run.sh 

desde el directorio del script, funcionó; si agregué el comando sh run.sh en mi crontab, no funcionó.

Para solucionar el problema, agregué la siguiente línea en mi script run.sh :

 printenv > env.txt 

De esta manera, puede ver la variable de entorno utilizada cuando usted (o el crontab) ejecuta el script. Al analizar las diferencias entre el env.txt generado a partir de la ejecución manual y la ejecución de crontab, noté que la variable PWD era diferente. En mi caso, pude resolverlo agregando la siguiente línea en la parte superior de mi script .sh :

 cd /PYTHON_SCRIPT_ABSOLUTE_PATH/ 

¡Espero que esto pueda ayudarte!