Qual è la 'directory di lavoro' quando cron esegue un lavoro?


171

Ho uno script che funziona quando lo eseguo dalla riga di comando, ma quando lo pianifico cronottengo errori che non riesce a trovare file o comandi. La mia domanda è duplice:

  1. Quando pianifico un cron job utilizzando crontab -e, utilizza il mio ID utente come base per le sue autorizzazioni? Oppure utilizza un ID utente cron di qualche tipo e le relative autorizzazioni?

  2. Quando viene avviato un cron job, qual è la directory di lavoro? È la directory in cui specifico lo script da eseguire o una directory diversa?

Ecco il mio lavoro cron:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

Ecco lo script attuale:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt

Ecco gli errori che visualizzo quando visualizzo il mailmessaggio prodotto da cron:

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

Non riesce a trovare template.txtma risiede nella stessa directory dello script. Inoltre non può essere eseguito ssmtp, ma posso come mio utente. Cosa mi manca per farlo funzionare correttamente?

Risposte:


159

Aggiungi cd /home/xxxx/Documents/Scripts/se desideri che il tuo lavoro venga eseguito in quella directory. Non c'è motivo per cui cron cambierebbe in quella particolare directory. Cron esegue i tuoi comandi nella tua home directory.

Per quanto riguarda ssmtp, potrebbe non essere nel tuo valore predefinito PATH. Il percorso predefinito di Cron dipende dall'implementazione, quindi controlla la tua pagina man, ma con ogni probabilità ssmtpè in /usr/sbincui non è nel tuo default PATH, solo quello di root.

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@Giles - Grazie, avrebbe cronil suo PATHo posso controllare il mio utente PATH? Ho impostato ssmtp per avere il proprio usere il wheelpermesso pensando che avrebbe permesso a chiunque di usarlo (incluso cron). Se aiuta Im su CENTOS 6.2
ProfessionalAmateur

3
@ProfessionalAmateur Il tuo problema non è che non ti è permesso usare ssmtp, ma che il tuo lavoro cron non trova alcun eseguibile chiamato ssmtpperché non è nel tuo PATH. Non esiste una cosa come "il tuo utente PATH"; questa è un'impostazione per processo, non un'impostazione per utente. Puoi impostare il percorso per tutti i tuoi lavori cron inserendo una PATH=…linea nel tuo crontab.
Gilles,

Ho dovuto aggiungere anche MAILTO='XXXX@gmail.com 'per farlo funzionare insieme alla configurazione PATH. Strano ma ha funzionato per me.
mac,

Per ssmtp si può usare; ´which ssmtp´ ...
Fredrick Gauss,

@FredrickGauss Fallotype ssmtp
Gilles

20

Se il tuo cronjob è uno script bash, il seguente CD eseguirà il CD nella posizione dello script (supponendo che tu stia utilizzando il percorso assoluto nella tua definizione cron):

cd "$(dirname "$0")";

14

Per rispondere alla domanda 1: se si esegue crontab -ecome proprio utente, i lavori verranno programmati nel crontab di quell'utente e verranno quindi eseguiti con le autorizzazioni di quell'utente.

Ma devi considerare che i lavori verranno eseguiti in una shell non interattiva, il che significa che $ PATH potrebbe essere diverso da quello che hai quando esegui lo script dalla riga di comando.

È meglio usare sempre percorsi completi negli script, specialmente se si prevede di pianificarli tramite at / cron ecc.

Consiglierei anche di utilizzare percorsi completi per tutti i file per evitare esattamente i problemi che vedi.

Per prevenire le condizioni di competizione e altri problemi di sicurezza, dovresti anche mktempassicurarti che il file che leggi non sia modificato da alcunché al di fuori del tuo script.

Quindi cambierei la sceneggiatura in qualcosa del tipo:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronesegue i lavori pianificati di ciascun utente come quell'utente. Questo dovrebbe essere sufficiente per farci capire che esegue i tuoi script relativi alla tua home directory.

Se ne hai bisogno per essere eseguito da una posizione diversa, utilizza semplicemente lo cdscript per andare in quella posizione.

ssmtpprobabilmente non è nel cronPATH predefinito (è impostato per essere molto ristretto dal design sulla maggior parte delle piattaforme). Puoi specificare il percorso completo di ssmtpnel tuo script oppure puoi impostare esplicitamente PATH in a) il tuo file crontab, che sarà disponibile per tutti i tuoi script, oppure b) in ogni script.


3

Controlla questo thread come puoi facilmente scoprire l'ambiente di cron, è molto meno di quello a cui sei abituato in una shell interattiva. La cosa migliore è presumere che non sia stato impostato nulla e impostarlo esplicitamente da soli.


1

La directory di lavoro predefinita per l' cronesecuzione del lavoro è la home directory, in genere /home/your-user-name.

Adottando l'ottimo commento di @Kusalananda.


1
No. Dipende da dove il sistema mantiene le home directory. /homeè tutt'altro che universale.
Kusalananda

1
@Kusalananda Lo standard LSB dice /home.
user259412

1
@peterh Bene, usi macOS /Userse storici di Unices /usr, e anche su Linux, la home directory di un utente di sistema potrebbe trovarsi da qualche parte sotto /varo altrove.
Kusalananda

1
@Kusalananda È giusto.
user259412

Grazie, sei l'unica persona che ha effettivamente risposto a questa domanda :)
OwN

0

Alcune persone hanno accennato o collegato ad esso, ma il modo migliore per scoprirlo dal momento che non riesco a trovarlo nei documenti man per la mia distribuzione è semplicemente aggiungere questo a un cron

* * * * * echo $PATH > /tmp/lolcronjobs

Nel mio caso, per impostazione predefinita Ubuntu utilizza solo ciò /usr/bin:/binche ha causato alcuni problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.