cron y "comando no encontrado"

0

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 espera, si en cambio utilizo cron con este programa:

* 6 * * * cd /path/to/ && ./executable

Recibo este error:

pypdfocr: command not found

Dado esto, en el script de 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?

    
pregunta SergeGardien 17.09.2017 - 23:09

2 respuestas

0

Al final, he seguido la solución provista en ¿Cómo usar macports Python en un trabajo cron? .

He comprobado la ruta de mi entorno ejecutando env desde el Terminal, luego lo 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, he modificado mi archivo cron con lo siguiente:

* * * * * /path/to/executable
    
respondido por el SergeGardien 24.09.2017 - 20:44
2

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:

  1. Haga referencia directamente a la ruta completa del archivo que necesito.
  2. 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.

    
respondido por el bjb 18.09.2017 - 18:13

Lea otras preguntas en las etiquetas