El comando de administración de Django no funciona en cron

Tengo problemas para progtwigr una manage.py celery call myapp.tasks.mytask con manage.py celery call myapp.tasks.mytask con mi usuario crontab, ya que cuando cron intenta ejecutar el trabajo, recibe esto en stderr (que se me envía por correo, como /var/mail/kal )

 Unknown command: 'celery' Type 'manage.py help' for usage. 

El mismo comando funciona completamente desde un shell de inicio de sesión de bash regular, pero no funcionará en crontab.

Estoy haciendo esto en Debian wheezy:

 $ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 7.0 (wheezy) Release: 7.0 Codename: wheezy 

He leído muchas preguntas similares en StackOverflow y he probado muchas de las soluciones sugeridas. Ninguno de ellos ha trabajado para mí hasta ahora. Aquí están las soluciones que he probado hasta ahora:

Primero, me aseguré de especificar las variables de entorno relevantes en el crontab:

 SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 

NOTA: estos se mantienen en su lugar en todas las siguientes soluciones.

1. Usando rutas completas a los archivos ejecutables de python y manage.py

 * * * * * /home/kal/.virtualenvs/foo_dev/bin/python /home/kal/foo/manage.py celery call myapp.tasks.mytask 

2. Cd’ing en la ruta del proyecto primero

 * * * * * cd /home/kal/foo && /home/kal/.virtualenvs/foo_dev/bin/python ./manage.py celery call myapp.tasks.mytask 

3. Envolviendo todo en un script de bash

Contenido de ~ / mytask.sh:

 #!/usr/bin/env bash source /home/kal/.virtualenvs/foo_dev/bin/activate; cd /home/kal/foo; ./manage.py celery call myapp.tasks.mytask; 

La línea crontab:

 * * * * * ~/mytask.sh 

Incluso modifiqué myproj/settings.py para dar salida a sys.path y sys.executable a stderr y sys.executable la salida entre cron y el shell de inicio de sesión, y son exactamente iguales:

Salida del trabajo cron:

 sys.executable: /home/kal/.virtualenvs/foo_dev/bin/python Content of sys.path: /home/kal/foo /home/kal/.virtualenvs/foo_dev/src/bootstrap /home/kal/.virtualenvs/foo_dev/src/django-json-rpc /home/kal/.virtualenvs/foo_dev/lib/python2.7 /home/kal/.virtualenvs/foo_dev/lib/python2.7/plat-linux2 /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-old /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-dynload /usr/lib/python2.7 /usr/lib/python2.7/plat-linux2 /usr/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/local/lib/python2.7/site-packages /home/kal/foo 

Salida desde el shell de inicio de sesión Bash:

 sys.executable: /home/kal/.virtualenvs/foo_dev/bin/python Content of sys.path: /home/kal/foo /home/kal/.virtualenvs/foo_dev/src/bootstrap /home/kal/.virtualenvs/foo_dev/src/django-json-rpc /home/kal/.virtualenvs/foo_dev/lib/python2.7 /home/kal/.virtualenvs/foo_dev/lib/python2.7/plat-linux2 /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-old /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-dynload /usr/lib/python2.7 /usr/lib/python2.7/plat-linux2 /usr/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/local/lib/python2.7/site-packages /home/kal/foo 

Estoy completamente desconcertado.

He encontrado la causa del problema.

Es muy muy sutil.

El problema es doble:

  1. No hay una variable de entorno USER en un trabajo cron; solo LOGNAME ;
  2. Cuando manage.py se ejecuta con un comando de administración especificado , Django falla silenciosamente en la configuración en blanco si se manage.py una excepción durante la importación del módulo de configuración.

Mi módulo de configuración intentaba hacer referencia a os.environ['USER'] , que no existe en el entorno de os.environ['USER'] . Por lo tanto, al importar el módulo de configuración, se genera una excepción, y Django falla silenciosamente en la configuración en blanco, lo que significa que INSTALLED_APPS blanco y sin comando de celery .

Olvídate de cron. Utilice el celerybeat_scheduler .

Asegúrese de que djcelery esté en INSTALLED_APPS en settings.py como se ve en https://pypi.python.org/pypi/django-celery

 INSTALLED_APPS += ("djcelery", ) import djcelery djcelery.setup_loader() 

Puedes usar la tela para poner esto en marcha. Tu virtualenv no se está activando quizás, pero con una herramienta como tejido, emites un comando

 def reset_app_local(appname): run("source ~/env/bin/activate && python manage.py celery call myapp.tasks.mytask ",shell="/bin/bash") 

Y ejecute lo siguiente si lo ejecuta en el servidor local.

 def reset_app_local(appname): local("source ~/env/bin/activate && python manage.py celery call myapp.tasks.mytask ",shell="/bin/bash")