Cuando cronejecuta 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_profilefuente 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 PATHo LD_LIBRARY_PATHvalores de entorno disponibles para el proceso que está tratando de poner en marcha y es por eso pdfimagesy gsno 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 STDOUTredirigirlo 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.shharía toda la export PATH, export LD_LIBRARY_PATH, etc para ponerse en marcha mi trabajo.
Su muestra executable.shpodrí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.outredirección de archivos no es necesaria ya que sin que todo STDOUTvaya a cron.out, pero hace que sea un poco más limpio hacerlo de esta manera. También el 2>&1sinsentido con el paréntesis asegura que ambos STDERRy STDOUTque sea en el archivo de salida; Esto ayuda a depurar por qué no se ejecutó un trabajo.
pdfimagesygsen su secuencia de comandos.