L'esecuzione di crontab non ha le stesse variabili d'ambiente dell'esecuzione dell'utente


20

Ho eseguito il mio lavoro crontab 0 2 */1 * * /aScript >aLog.log 2>&1come utente 'root', e tuttavia ho scoperto che env è diverso da env dell'utente 'root', e quindi ho riscontrato un comportamento runtime diverso dei miei script.

Un tentativo di correzione stava inserendo i comandi di esportazione nei file rc.d, ma non veniva ancora visualizzato! Alla fine inserisco i comandi di esportazione in aScript stesso.

La mia domanda è: esiste un modo migliore per affrontare questo problema? e perché manca env anche se proviene dallo stesso utente "root"? (Modifica crontab eseguendo 'crontab -e' dalla radice)


8
Cron funziona sempre con un ambiente prevalentemente vuoto. HOME, LOGNAME e SHELL sono impostati; e un PERCORSO molto limitato. Se non vuoi impostare tu stesso tutte le variabili, potresti essere in grado di accedere al sourcetuo profilo (bash).
cyberx86,

2
@ cyberx86: Perché non scriverlo come risposta e ottenere un rappresentante?
user9517 supporta GoFundMonica il

2
@Iain: rep è sempre il benvenuto - ma a volte sembra che una risposta a una riga non guadagni davvero il rappresentante. Accetto pienamente che una risposta concisa abbia il suo posto, ma ho usato (forse in modo errato) i commenti come una "via d'uscita" quando volevo fornire assistenza, ma non scrivere una spiegazione completa e dettagliata (era l'una di notte. ..). Prenderò comunque il tuo consiglio, approfondirò un po 'questo e lo aggiungerò come risposta.
cyberx86,

@ cyberx86: Meglio avere un liner corretto che errato o niente.
user9517 supporta GoFundMonica il

Risposte:


31

Cron funziona sempre con un ambiente prevalentemente vuoto. HOME, LOGNAME e SHELL sono impostati; e un PERCORSO molto limitato. Si consiglia pertanto di utilizzare percorsi completi per gli eseguibili ed esportare tutte le variabili necessarie nello script quando si utilizza cron.

Esistono diversi approcci che puoi utilizzare per impostare le variabili di ambiente in cron, ma tutte equivalgono a impostarle nel tuo script.

Approccio 1:

Imposta ogni variabile che ti serve manualmente nel tuo script.

Approccio 2:

Fonte il tuo profilo:

. $HOME/.bash_profile(o . $HOME/.profile)

(Di solito scoprirai che il file sopra genererà altri file (es. ~ / .Bashrc -> / etc / bashrc -> /etc/profile.d/*) - in caso contrario, puoi anche procurarteli.)

Approccio 3:

Salva le variabili di ambiente in un file (esegui come l'utente desiderato):

env > /path/to/my_env.sh

Quindi importare tramite lo script cron:

env - `cat /path/to/my_env.sh` /bin/sh

Approccio 4:

In alcuni casi, è possibile impostare variabili cron globali in /etc/default/cron. Esiste tuttavia un elemento di rischio in quanto questi saranno impostati per tutti i lavori cron.


Approach 2 è il migliore per i server in cui hai cose sensibili che non dovrebbero colpire il disco in ambiente: password, chiavi API, ecc. Ha funzionato a meraviglia per me, quindi grazie.
ap

Approach 4 ha funzionato per me in un ambiente docker in cui il motore docker imposta l'ambiente. Per far funzionare tutto questo, ho dovuto salvare il mio env nel punto di accesso docker. La soluzione completa è qui: github.com/rayyanqcri/swarm-scheduler
hammady,

Potresti approfondire l'approccio 3 per me? Quando provo a importarlo ricevobash: SHELL=/bin/bash: No such file
KuboMD il

1

Cron crea la propria PROPRIA shell con l'uso specificato attraverso il quale verrà eseguita.

Quindi, se vuoi mantenere la stessa variabile del tuo utente, prova a eseguirla con il tuo utente, invece di root o di qualsiasi altro utente.

O

Il modo migliore è esportare quelle variabili nel tuo script.


1

In RedHat CentOS, è possibile impostare /etc/rc.d/init.d/functions default PATH su permanentemente impostato. /etc/rc.d/crond chiama le funzioni all'avvio.


0

Ho avuto un problema simile sul mio AWS. Capito così

which python3

mi ha dato la /usr/bin/local/python3posizione

e poi

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
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.