cron y "comando no encontrado"

2

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?

SergeGardien
fuente
2
agregue la ruta completa a pdfimagesy gsen su secuencia de comandos.
fd0
No llamo pdfimages y gs directamente en mi script, ambos son utilizados por pypdfocr, por lo tanto, no puedo agregar la ruta completa en mi script.
SergeGardien

Respuestas:

4

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:

  1. Referencia directa a la ruta completa del archivo que necesito.
  2. 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.

bjb
fuente
croncrea su propio ambiente. En particular, SHELL se establece en /bin/shy PATH se establece en /usr/bin:/bin. El entorno puede personalizarse en un usuario crontab. Leer más en man 5 crontab.
fd0
@ fd0: la configuración de variables de entorno en el crontab no es universal en todas las implementaciones; No estoy seguro de si darwin / osx / macos lo hace? En cualquier caso, esa configuración se aplicaría a todas las entradas cron que pueden o no ser deseables. Como tal, probablemente aún sugiera que cron ejecute un script de todos modos, ya que al menos tiene control de trabajo individual.
bjb
0

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 envdesde la Terminal, luego la exporté a mi ejecutable.

ejecutable:

#!/bin/bash
export PATH=/Library/Frameworks/Mono.framework/Versions/Current/bin/:/opt/local/bin:/opt/local/sbin://anaconda/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/2.6/bin:/sw/bin:/sw/sbin:/usr/bin:/bin:/usr/local/bin:/opt/X11/bin:/Users/USER/Library/Android/sdk/platform-tools/:/Users/USER/Library/Android/sdk/tools/:/usr/sbin/:/Users/USER/Tools/cpdf/OSX-Intel/
# ...
# REST OF SCRIPT
# ...

Después de esto, modifiqué mi cronfile con lo siguiente:

* * * * * /path/to/executable
SergeGardien
fuente