Estoy configurando un trabajo cron para ejecutar un script bash ejecutable que contiene un comando pypdfocr. Cada vez que ejecuto manualmente el script, todo funciona como se esperaba, si en cambio uso cron con este programa:
* 6 * * * cd /path/to/ && ./executable
Me sale este error:
pypdfocr: command not found
Dado esto, en el script bash he intentado dar la ruta completa a pypdfocr, es decir:
/anaconda/bin/pypdfocr
Pero ahora tengo:
/bin/sh: pdfimages: command not found
/bin/sh: gs: command not found
¿Alguna idea de cómo puedo solucionar esto?
pdfimages
ygs
en su secuencia de comandos.Respuestas:
Cuando
cron
ejecuta un evento, utiliza el entorno de shell predeterminado del UID en ejecución. Sin embargo, no se aplica la personalización de "perfil", es decir, su.bash_profile
fuente no se obtiene y, por lo tanto, no se selecciona ninguna configuración de RUTA. Además, tampoco creo que se recojan los perfiles comunes. Como tal, es probable que tenga ningunaPATH
oLD_LIBRARY_PATH
valores de entorno disponibles para el proceso que está tratando de poner en marcha y es por esopdfimages
ygs
no está siendo recogido por defecto.En el pasado, resolví esta de dos maneras:
Normalmente prefiero el segundo puesto que no solo me permite configurar un entorno para ejecutar el trabajo, sino que también hace que sea relativamente fácil agregar situaciones de depuración fácilmente. Por ejemplo, si el trabajo no funciona correctamente, puedo editar el script de shell y
STDOUT
redirigirlo a un archivo de depuración.En resumen, tendría una entrada cron de
* 6 * * * cd /path/to/ && ./executable.sh
.. lo que iba a cambiar a la ruta, pero la
executable.sh
haría toda laexport PATH
,export LD_LIBRARY_PATH
, etc para ponerse en marcha mi trabajo.Su muestra
executable.sh
podría ser tan simple como esta:La
executable.out
redirección de archivos no es necesaria ya que sin que todoSTDOUT
vaya acron.out
, pero hace que sea un poco más limpio hacerlo de esta manera. También el2>&1
sinsentido con el paréntesis asegura que ambosSTDERR
ySTDOUT
que sea en el archivo de salida; Esto ayuda a depurar por qué no se ejecutó un trabajo.fuente
cron
crea su propio ambiente. En particular, SHELL se establece en/bin/sh
y PATH se establece en/usr/bin:/bin
. El entorno puede personalizarse en un usuariocrontab
. Leer más enman 5 crontab
.Al final, he seguido la solución proporcionada en ¿Cómo usar Macports Python en un trabajo cron? .
Verifiqué mi RUTA del entorno ejecutándome
env
desde la Terminal, luego la exporté a mi ejecutable.ejecutable:
Después de esto, modifiqué mi cronfile con lo siguiente:
fuente