2012-09-21 32 views
14

Mi script en Python, no se está ejecutando bajo mi crontab.Crontab no correr mi script en Python

He puesto esto en el script en Python, en la parte superior:
#!/usr/bin/python

He intentado hacer esto:
chmod a+x myscript.py

añadido a Mi crontab -e:


    SHELL=/bin/bash 
    PATH=/sbin:/bin:/usr/sbin:/usr/bin 
    MAILTO=""

* * * * * /home/me/project/myscript.py 

Mi/var/log/cron dice:
Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

Pero mi secuencia de comandos no se está ejecutando porque cuando reviso mi base de datos sql, nada ha cambiado. Si lo ejecuto directamente en el terminal de este modo:

python /home/me/project/myscript.py

consigo el resultado correcto.

Este es el myscript.py:

#!/usr/bin/python 

import sqlite3 

def main(): 
    con = sqlite3.connect("test.db") 

    with con: 

     cur = con.cursor() 

     cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)") 

     cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')") 

     cur.execute("SELECT * FROM testtable") 

     print cur.fetchall() 


if __name__ == "__main__": 
    main() 

EDIT: Por comentarios: Sí, existe /usr/bin/python. También puedo ejecutar el script de python directamente usando solo /home/me/project/myscript.py. /usr/bin/python /home/me/project/myscript.py funciona. Entonces, ¿no creo que esta es la causa?

+0

¿Cuál es el guión? ¿Depende de algo ambiental? – tMC

+0

Sí, creo que necesitamos ver dentro de su myscript.py –

+2

Establezca la variable MAILTO a su nombre de usuario. Luego recibirá un mensaje de error en su correo que podría proporcionar una pista. – unutbu

Respuesta

11

Lo que ocurre cuando se escribe

/home/me/project/myscript.py en la cáscara?

Se puede utilizar de forma explícita /usr/bin/python en su comando crontbb?

¿Puede utilizar una ruta de acceso absoluta a su test.db o cd en el directorio correcto y luego ejecutar su secuencia de comandos python?

Esto es útil contar con instrucciones de depuración en su pitón y registrar algunos datos. Crontab puede ser muy difícil de depurar.

+0

¡Jaja, lo hiciste! Cambié el test.db para usar una ruta absoluta '/ home/me/project/test.db' ... ¡Y funciona! – user1636922

9

Es posible que el guión no se inicia porque no puede localizar el intérprete de Python. El entorno de Crontab puede ser muy diferente del entorno de shell que está utilizando. Las rutas de búsqueda pueden diferir significativamente. Además, se prueba la secuencia de comandos al iniciar el intérprete de python explícitamente, mientras que se espera que el crontab sólo poner en marcha el guión. Pongo esta línea en la parte superior de mis scripts de Python: #!/Bin/env python. Esta línea ayudará a ubicar el intérprete independientemente del directorio en el que esté instalado, siempre que se encuentre en la ruta de búsqueda.

+0

Actualmente estoy en bash, y he agregado su sugerencia '#!/Bin/env python'. No funcionó, parece. – user1636922

+0

Primero, vea si tiene/bin/env o si env está en un directorio diferente. – shargors

+23

Comience el siguiente comando para tener el mismo entorno que el utilizado por crontab: env -i/bin/bash --noprofile --norc Luego, inicie el script de python y vea por qué falla. Esto debería darte una idea. – shargors

1

tratar de poner en su crontab:

* * * * * python /path/to/your/script.py 

en lugar de

* * * * * /path/to/your/script.py 

también la línea shebang es #!/usr/bin/env python en algunos entornos.env es un ejecutable, y usted tiene que saber dónde vive con "$ which env".

0
  • ¿El usuario cron (donde falla la secuencia de comandos) y el usuario terminal (cuando la secuencia de comandos tiene éxito) son los mismos?
  • Puede redirigir la salida del trabajo a algún archivo como se menciona en Cron Job Log - How to Log?. Podríamos ver si eso ayuda.
0

Si bien las respuestas aquí delinean claramente el problema y la solución, quería agregar otra respuesta que me ayudó.

Si su script de python está llamando a una base de datos, entonces asegúrese de que puede conectarse correctamente al db dentro del cron env (para identificar el cron env ->https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work). Tenía un archivo que se ejecutaría desde el shell, pero no como un crontab a menos que me conectara a la base de datos como raíz desde el script de Python.

1

Normalmente, los problemas de crontab como este son causados ​​por la variable de entorno PATH que es más restrictiva/diferente de lo que es el entorno PATH de su usuario normal. Dado que su shell utiliza el entorno PATH para encontrar el ejecutable (por ejemplo,/usr/bin/python se encuentra en/usr/bin cuando escribe "python" en el intérprete de comandos de shell), cuando el PATH carece de ubicaciones comunes, como/usr/bin o/usr/sbin, su tarea cron fallará. Esto me ha mordido muchas veces. La solución simple es simplemente establecer explícitamente la RUTA usted mismo cerca de la parte superior de su archivo crontab, antes de cualquier comando que lo necesite. Por lo tanto, sólo editar el crontab como de costumbre y añadir algo como esto en la parte superior (si binaria no está en una de las vías siguientes, tendrá que añadir que después de dos puntos):

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 
2

I' d tiene el mismo problema A pesar de que el script ejecutado manualmente funcionaba, en crontab no funcionaba ninguna de las opciones mencionadas anteriormente. He movido mi script de/home/user/script_directory/a/opt/scripts/y comenzó a funcionar. La causa posible del problema deberían ser los permisos de acceso (lectura) a la subcarpeta ubicada en el directorio de inicio.

0

A veces me enfrento al mismo problema. Cualquier cosa que intente algo como se aconseja aquí, es posible que no obtenga el resultado.

Así que empezar a escribir "disparador" escritura del golpe de la siguiente manera (Vamos a nombrar que trigger.sh):

#!/bin/bash 

/full_path/python_script.py 

Y yo estoy llamando desde trigger.sh crontab y todo está bien.

EDIT: Por supuesto, no se olvide de hacer siguiente (dar cumplimiento a la derecha):

$chmod +x python_script.py 
$chmod +x trigger.sh 
0

La manera más fácil de manejar esto es agregar el camino de su instalación de Python a PATH en la parte superior de la secuencia de comandos shell. Algo así como:

#!/usr/bin/env bash 
export PATH="{path to your python installation}:$PATH" 
python {python_file_name}.py 

Como dijo @Shargors puede probarlo por

env -i /bin/bash --noprofile --norc 
0

Hay una gran cantidad de la mitad de las respuestas a través de la Internet, así que pensé que iba a capturar esto para salvar a otra persona algún tiempo .

En primer lugar, cronjob hace un mal trabajo de decirle dónde está fallando.Recomiendo enviar la salida stderr a un archivo de registro de la siguiente manera:

comando crontab:

# m h dom mon dow command 
* * * * * /path/to/your_file.sh >> out.txt 2>&1 

ya que es probable que ejecuta el comando como usuario, comprobar directorio de inicio para el archivo de registro. Tenga en cuenta que esta secuencia de comandos se ejecuta cada minuto, lo que es bueno para la depuración.

El siguiente problema es que probablemente tenga un problema de ruta ... como la secuencia de comandos probablemente está intentando ejecutar desde su directorio de inicio. Este script establece el directorio actual, lo convierte en archivo y luego ejecuta su programa.

Prueba esto:

Archivo de Escritura

#!/bin/sh 
cd "$(dirname "$0")"; 
CWD="$(pwd)" 
echo $CWD 
python your_python_file.py 

Hope esto ahorra a otra persona algún tiempo la depuración !!!

0

probar este

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml 

Hay un cierto problema de ruta con cron. Entonces, cuando te mueves al directorio con el archivo python, ¡cron funciona como un hechizo!

Cuestiones relacionadas