Sintaxis de Crontab; Múltiples comandos


13

Me gustaría obtener la siguiente cadena de comandos como cronjob:

* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

Funciona en la consola, pero no obtengo ningún resultado del cronjob.

Seguí esta sugerencia, reemplazándola por

* * * * * env > /tmp/env.output

para averiguar si env es diferente. No pude encontrar nada relevante además de que PATH sea diferente. Entonces establecí

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

y aun así no funcionó. Finalmente lo reemplacé con

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py
* * * * * env > /tmp/env.output

y esta vez ni siquiera recibí el env.outputarchivo. Por lo tanto, creo que hay algo mal con mi sintaxis, pero se ve exactamente como las sugerencias de comandos múltiples que encontré en línea.

¿Que está pasando aqui? Si no es obvio, ¿qué puedo hacer para rastrear el error?

PATH=/usr/local/anaconda2/envs/myenv3/bin:~/.conda:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

out.err:

/bin/sh: 6: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 15: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 17: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
Only bash and zsh are supported

Respuestas:


16

En Ubuntu, por defecto, el crondaemon ejecuta todos los trabajos utilizando sh( dash) shell y dashno tiene sourceincorporado.

Debe usar la forma POSIX, es decir .:

* * * * * . activate myenv3 && cd ~/foo/bar && python sssb.py

Alternativamente, puede ejecutar el trabajo como argumento para bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'

Ahora tengo un archivo /tmp/env.output nuevamente, pero aún no hay salida del archivo principal.
FooBar

1
@FooBar, ¿cuál es el resultado grep SHELL /tmp/env.output? También ejecute el primer trabajo como * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1y verifique el contenido de/tmp/out.err
heemayl

Dice SHELL = / bin / sh. Pegaré el resultado out.erry la RUTA real que pegué en la pregunta.
FooBar

1
+1 para su uso de encapsulación $(command -v bash) -c ' ... ': resuelve todo el tigaboo sin entrar en los (no tan) detalles desordenados.
Cbhihe

1
El comando -v parte de no "$(command -v bash)" -c '...'tiene sentido. Just dobash -c '...'
geirha
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.