come impostare la variabile PATH di crontab


17

Ho avuto un problema con l'esecuzione di uno script da crontab. Dopo alcune ricerche ho capito che il problema era perché il parametro PATH non include / sbin.

Ho visto cosa include in / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Come test: semplice cron job per stampare la variabile PATH:

* * * * * echo $PATH &> /root/TMP.log

l'output è:

cat /root/TMP.log
/usr/bin:/bin

Non capisco questo comportamento ... Come posso impostare la variabile PATH ...? O meglio: come aggiungere percorsi ad esso?

Risposte:


17

Sebbene siano simili, un crontab utente (modificato usando crontab -e) è diverso e mantiene un percorso separato dal crontab di sistema (modificato modificando / etc / crontab).

Il crontab di sistema ha 7 campi, inserendo un nome utente prima del comando. L'utente crontab, d'altra parte, ha solo 6 campi, andando direttamente nel comando immediatamente dopo i campi temporali.

Allo stesso modo, il PERCORSO nel crontab di sistema normalmente include le directory / sbin, mentre il PERCORSO nel crontab dell'utente non lo fa. Se si desidera impostare PATH per il crontab utente, è necessario definire la variabile PATH nel crontab dell'utente.


Una semplice soluzione per aggiungere il normale PERCORSO ai comandi della shell in cron è avere il cronjob come sorgente del tuo profilo eseguendo bash in una shell di login. per esempio invece di

* * * * * some command

Puoi invece correre

* * * * * bash -lc some command

In questo modo se il tuo profilo imposta il PERCORSO o altre variabili d'ambiente su qualcosa di speciale, viene anche incluso nel tuo comando.


Grazie, questo lo spiega ... Ma in questo modo posso solo impostare il PERCORSO e non modificarlo, perché PATH = / sbin: $ PATH o simili non funzionano. Ho provato ...
csny,

Sì, dovresti definire il PERCORSO da zero in un caso come questo, il che dovrebbe essere abbastanza semplice, poiché conosci tutti i comandi eseguiti nel tuo crontab, quindi devi solo tenerne conto.
fagioli

@madumlao bash -lcnon aiuta. Per ora sto bene impostando manualmente PATH, ma se installo alcuni script, voglio che vengano riconosciuti nei cronjob senza specificare percorsi completi. Sono sicuro che è possibile in qualche modo, ed bash -lcè sulla buona strada per una soluzione :)
csny

4
bash -lc avvia una shell di login che genera il profilo dell'utente. Ciò significa che utilizza il PATH impostato in ~ / .bash_profile, ~ / .profile o ~ / .bashrc ... hai impostato il percorso lì? Se è così e funziona male aggiorna la mia risposta per questo
madumlao

Grande. Grazie Madunlao. Dopo aver aggiunto manualmente la cartella del file bin a ~ / .bash_profile, il mio cronjob funziona bene.
张健健

8

Se hai bisogno di PATH predefiniti a livello di sistema e di altre variabili ENV (definite in /etc/profile.d), inserisci quanto segue:

* * * * * . /etc/profile; your cmd

3

È possibile impostare il PERCORSO (o altri parametri) nella riga cronjob o su una riga singola. Ma non puoi usare l'espansione della shell comePATH=$PATH:/usr/local/bin . Ma la tilde è consentita per le scorciatoie della directory home.

Dai libri:

Una linea attiva in un crontab è un'impostazione di ambiente o un comando cron. Un'impostazione ambientale ha la forma: nome = valore in cui gli spazi bianchi attorno al segno di uguale (=) sono facoltativi e tutti gli spazi bianchi non iniziali successivi nel valore fanno parte del valore assegnato a nome. La stringa del valore può essere inserita tra virgolette (singole o doppie, ma corrispondenti) per conservare spazi bianchi iniziali o finali.

Vedere man 5 crontab per maggiori informazioni.

Quindi questo dovrebbe funzionare:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path

0

Ho avuto lo stesso problema e ho trovato un altro modo per eseguire il mio script in crontab. Penso che il modo più semplice per eseguire il tuo programma sia creare uno script che potrebbe cd nella directory del tuo programma. Quindi chiama il tuo programma in quello script.

questo è un esempio di uno script (nome script = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

quindi, esegui il tuo script eseguibile:

chmod 755 launcher.sh

E infine, aggiungi il tuo script a crontab

crontab -e

e aggiungi questa riga alla fine:

@reboot sh /home/pi/test/launcher.sh

(Ho impostato il programma per l'esecuzione ad ogni riavvio)

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.