cron e "comando non trovato"

0

Sto configurando un cron job per eseguire uno script bash eseguibile che contiene un comando pypdfocr. Ogni volta che eseguo manualmente lo script, tutto funziona come previsto, se invece utilizzo cron con questo programma:

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

Ho ricevuto questo errore:

pypdfocr: command not found

Dato questo, nello script di bash ho cercato di dare il percorso completo a pypdfocr, cioè:

/anaconda/bin/pypdfocr

Ma ora ho:

/bin/sh: pdfimages: command not found
/bin/sh: gs: command not found

Qualche idea su come posso risolvere questo problema?

    
posta SergeGardien 17.09.2017 - 23:09
fonte

2 risposte

0

Alla fine ho seguito la soluzione fornita da Come utilizzare Macports Python in un cron job? .

Ho controllato il mio ambiente PATH eseguendo env da Terminal, quindi l'ho esportato nel mio eseguibile.

eseguibile:

#!/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
# ...

Dopo questo ho modificato il mio cronfile con il seguente:

* * * * * /path/to/executable
    
risposta data 24.09.2017 - 20:44
fonte
2

Quando cron esegue un evento, utilizza l'ambiente di shell predefinito dell'UID in esecuzione. Tuttavia, non viene applicata alcuna personalizzazione di "profilo", cioè il tuo .bash_profile non è originario e quindi le impostazioni PATH non vengono rilevate. Inoltre, non credo che i profili comuni vengano raccolti. Di conseguenza, probabilmente non hai impostazioni di ambiente PATH o LD_LIBRARY_PATH disponibili per il processo che stai tentando di avviare ed è per questo che pdfimages e gs non vengono prelevati per impostazione predefinita.

In passato, ho risolto questo in due modi:

  1. Fa riferimento direttamente al percorso completo del file di cui ho bisogno.
  2. Crea uno script di shell wrapper per il lavoro.

Di solito preferisco il 2 ° poiché non solo mi consente di configurare un ambiente in cui eseguire il lavoro, ma rende anche relativamente facile aggiungere facilmente le situazioni di debug. Ad esempio, se il lavoro non funziona correttamente, posso semplicemente modificare lo script della shell e inserire il reindirizzamento STDOUT in un file di debug.

Quindi, in breve, avrei una voce cron di

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

.. che cambierebbe nel percorso, ma executable.sh farebbe tutto il export PATH , export LD_LIBRARY_PATH , ecc. per ottenere il mio lavoro impostato.

Il tuo campione executable.sh potrebbe essere semplice come questo:

#!/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

Il reindirizzamento del file executable.out non è necessario poiché senza tutto STDOUT va a cron.out , ma rende un po 'più pulito farlo in questo modo. Anche il 2>&1 nonsense con le parentesi assicura che sia STDERR che STDOUT lo facciano nel file di output; questo aiuta a fare il debug perché un lavoro non è stato eseguito.

    
risposta data 18.09.2017 - 18:13
fonte

Leggi altre domande sui tag