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 ninguna PATH
o LD_LIBRARY_PATH
valores de entorno disponibles para el proceso que está tratando de poner en marcha y es por eso pdfimages
y gs
no está siendo recogido por defecto.
En el pasado, resolví esta de dos maneras:
- Referencia directa a la ruta completa del archivo que necesito.
- Cree un script de shell de envoltura para el trabajo.
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 la export PATH
, export LD_LIBRARY_PATH
, etc para ponerse en marcha mi trabajo.
Su muestra executable.sh
podría ser tan simple como esta:
#!/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 executable.out
redirección de archivos no es necesaria ya que sin que todo STDOUT
vaya a cron.out
, pero hace que sea un poco más limpio hacerlo de esta manera. También el 2>&1
sinsentido con el paréntesis asegura que ambos STDERR
y STDOUT
que sea en el archivo de salida; Esto ayuda a depurar por qué no se ejecutó un trabajo.
pdfimages
ygs
en su secuencia de comandos.