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
no tiene origen y, por lo tanto, no se selecciona ninguna configuración de PATH. Tampoco creo que los perfiles comunes sean recogidos. Por lo tanto, es probable que no tenga disponibles las configuraciones de entorno PATH
o LD_LIBRARY_PATH
para el proceso que está intentando iniciar y es por eso que pdfimages
y gs
no se seleccionan de forma predeterminada.
En el pasado, he resuelto esta de dos maneras:
- Haga referencia directamente a la ruta completa del archivo que necesito.
- Cree un script de shell de envoltorio para el trabajo.
Por lo general, prefiero la segunda, ya que no solo me permite configurar un entorno para la ejecución del 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, solo puedo editar el script de shell y poner en redirección STDOUT
a un archivo de depuración.
En resumen, tendría una entrada cron de
* 6 * * * cd /path/to/ && ./executable.sh
... que cambiaría a la ruta, pero executable.sh
haría todo el export PATH
, export LD_LIBRARY_PATH
, etc. para configurar mi trabajo.
Su muestra executable.sh
podría ser tan simple como esto:
#!/bin/bash
# if you want to just pick up your profile, you can '.' source it
. ~/.bash_profile
export PATH=/where/i/find/gs
export LD_LIBRARY_PATH=/if/i/need/libs
(./executable 2&>1) >executable.out
La redirección del archivo executable.out
no es necesaria, ya que sin ella, STDOUT
va a cron.out
, pero hace que sea un poco más limpio hacerlo de esta manera. También el 2>&1
sin sentido con el paréntesis se asegura de que tanto STDERR
como STDOUT
lo hagan en el archivo de salida; esto ayuda a depurar por qué no se ejecutó un trabajo.