Ambiente diverso
Cron trasmette un set minimo di variabili di ambiente ai tuoi lavori. Per vedere la differenza, aggiungi un lavoro fittizio come questo:
* * * * * env > /tmp/env.output
Attendi la creazione di /tmp/env.output
, quindi rimuovi il lavoro. Ora confronta il contenuto di /tmp/env.output
con l'output di env
eseguito nel tuo terminale normale.
Un "getcha" comune qui è la variabile di ambiente PATH
che è diversa. Forse lo script di cron utilizza il comando somecommand
trovato in /opt/someApp/bin
, che hai aggiunto a PATH
in /etc/environment
? cron ignora PATH
da quel file, quindi runnning somecommand
dallo script fallirà quando viene eseguito con cron, ma funziona quando viene eseguito in un terminale. Vale la pena notare che le variabili da /etc/environment
verranno passate ai lavori cron, ma non solo le variabili cron si impostano in modo specifico, come PATH
.
Per aggirare questo problema, imposta la tua variabile PATH
nella parte superiore dello script. Per es.
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# rest of script follows
Alcuni preferiscono usare solo i percorsi assoluti per tutti i comandi. Raccomando contro quello. Considera cosa succede se vuoi eseguire il tuo script su un sistema diverso, e su quel sistema, invece, il comando è in /opt/someAppv2.2/bin
. Dovresti passare attraverso l'intero script sostituendo /opt/someApp/bin
con /opt/someAppv2.2/bin
invece di fare solo una piccola modifica sulla prima riga dello script.
Puoi anche impostare la variabile PATH nel file crontab, che si applicherà a tutti i lavori cron. Per es.
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
15 1 * * * backupscript --incremental /home /root