Come ottenere CRON per chiamare i PERCORSI corretti

Sto cercando di ottenere cron per chiamare i percorsi corretti. Quando eseguo uno script Python dalla shell, lo script funziona bene poiché usa i PATH impostati in bashrc, ma quando uso cron tutti i PATH non sono usati da bashrc. C’è un file in cui posso inserire i PATH per cron come bashrc o un modo per chiamare i PATH da bashrc?

Scusa non penso di averlo scritto correttamente, posso ottenere lo script corretto da eseguire (ovvero il PERCORSO per lo script in crontab non è il problema qui), è solo quando lo script è in esecuzione, eseguo una build e questo usa il PATH impostati in .bashrc . Quando eseguo lo script quando sono connesso, i PATH di .bashrc vengono richiamati. Poiché cron non viene eseguito in una shell, per dire che non richiama .bashrc . C’è un modo per farlo senza dover scrivere un wrapper di bash script?

Ho usato /etc/crontab . Ho usato vi e inserito nei PATH che mi servivano in questo file e l’ho eseguito come root. Il normale crontab sovrascrive i PATH che hai impostato. Un buon tutorial su come farlo .

Il file cron di sistema è simile al seguente:

 This has the username field, as used by /etc/crontab. # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file. # This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # mh dom mon dow user command 42 6 * * * root run-parts --report /etc/cron.daily 47 6 * * 7 root run-parts --report /etc/cron.weekly 52 6 1 * * root run-parts --report /etc/cron.monthly 01 01 * * 1-5 root python /path/to/file.py 

Molto probabilmente, cron è in esecuzione in un ambiente molto scarso. Controlla le variabili d’ambiente che cron sta usando aggiungendo un lavoro fittizio che scarica env in un file come questo:

 * * * * * env > env_dump.txt 

Confrontalo con l’output di env in una normale sessione di shell.

Puoi anteporre le tue variabili d’ambiente al crontab locale definendole nella parte superiore del tuo crontab.

Ecco una soluzione rapida per anteporre $PATH all’attuale crontab:

 # echo PATH=$PATH > tmp.cron # echo >> tmp.cron # crontab -l >> tmp.cron # crontab tmp.cron 

Il crontab risultante sarà simile alla risposta di chrissygormley, con PATH definito prima delle regole di crontab.

Dovresti inserire percorsi completi nel tuo crontab . Questa è l’opzione più sicura.
Se non vuoi farlo, puoi inserire uno script wrapper nei tuoi programmi e impostare il PERCORSO lì.

per esempio

 01 01 * * * command 

diventa:

 01 01 * * * /full/path/to/command 

Inoltre qualsiasi cosa chiamata da cron dovrebbe essere molto attenta ai programmi che esegue e probabilmente imposta la propria scelta per la variabile PATH .

MODIFICARE:

Se non sai dove è il comando che vuoi eseguire which dalla tua shell e ti dirà il percorso.

EDIT2:

Quindi, una volta avviato il programma, la prima cosa che dovrebbe fare è impostare PATH e qualsiasi altra variabile richiesta (ad es. LD_LIBRARY_PATH ) sui valori richiesti per l’esecuzione dello script.
Fondamentalmente invece di pensare a come modificare l’ambiente cron per renderlo più adatto al tuo programma / script – fai in modo che il tuo script gestisca l’ambiente che gli viene dato, impostando uno script appropriato all’avvio.

Fai in modo che le tue variabili funzionino per te, questo consentirà l’accesso t

Definisci il tuo PERCORSO in /etc/profile.d/*.sh

Variabili d’ambiente a livello di sistema

I file con estensione .sh nella directory /etc/profile.d vengono eseguiti ogni volta che viene immessa una shell di login bash (ad esempio quando si effettua l’accesso dalla console o su ssh), nonché dal DisplayManager quando viene caricata la sessione desktop.

Puoi ad esempio creare il file /etc/profile.d/myenvvars.sh e impostare variabili come questa:

 export JAVA_HOME=/usr/lib/jvm/jdk1.7.0 export PATH=$PATH:$JAVA_HOME/bin 

Esegui crontab con l’opzione di accesso!

CRONTAB esegue script o comandi con variabili d’ambiente

 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php' 0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh 

L’impostazione di PATH subito prima della riga di comando nel mio crontab ha funzionato per me:

 * * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing 

Problema

Il tuo script funziona quando lo esegui dalla console ma fallisce in cron.

Causa

Il tuo crontab non ha le variabili di percorso giuste (e possibilmente shell)

Soluzione

Aggiungi la tua shell corrente e traccia il crontab

Script per farlo per te

 #!/bin/bash # # Date: August 22, 2013 # Author: Steve Stonebraker # File: add_current_shell_and_path_to_crontab.sh # Description: Add current user's shell and path to crontab # Source: http://brakertech.com/add-current-path-to-crontab # Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh # function that is called when the script exits (cleans up our tmp.cron file) function finish { [ -e "tmp.cron" ] && rm tmp.cron; } #whenver the script exits call the function "finish" trap finish EXIT ######################################## # pretty printing functions function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; } function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; } function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; } function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; } function printline { hr=------------------------------------------------------------------------------------------------------------------------------- printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}" } #################################### # print message and exit program function die { print_error "$1"; exit 1; } #################################### # user must have at least one job in their crontab function require_gt1_user_crontab_job { crontab -l &> /dev/null [ $? -ne 0 ] && die "Script requires you have at least one user crontab job!" } #################################### # Add current shell and path to user's crontab function add_shell_path_to_crontab { #print info about what's being added print_notification "Current SHELL: ${SHELL}" print_notification "Current PATH: ${PATH}" #Add current shell and path to crontab print_status "Adding current SHELL and PATH to crontab \nold crontab:" printline; crontab -l; printline #keep old comments but start new crontab file crontab -l | grep "^#" > tmp.cron #Add our current shell and path to the new crontab file echo -e "SHELL=${SHELL}\nPATH=${PATH}\n" >> tmp.cron #Add old crontab entries but ignore comments or any shell or path statements crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron #load up the new crontab we just created crontab tmp.cron #Display new crontab print_good "New crontab:" printline; crontab -l; printline } require_gt1_user_crontab_job add_shell_path_to_crontab 

fonte

https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

Uscita di esempio

add_curent_shell_and_path_to_crontab.sh esempio di output

Aggiungere una definizione PATH all’utente crontab con i valori corretti aiuterà … Ho riempito il mio con solo:

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

Ed è sufficiente far funzionare tutti i miei script … Includere qualsiasi percorso personalizzato lì se necessario.

L’ambiente predefinito per i lavori cron è molto scarso e potrebbe essere molto diverso dall’ambiente in cui si sviluppano gli script Python. Per uno script che può essere eseguito in cron, qualsiasi ambiente da cui si dipende dovrebbe essere impostato in modo esplicito. Nel file cron stesso, includi percorsi completi per gli eseguibili python e per i tuoi script python.

Sul mio AIX cron prende le sue variabili ambientali da / etc / environment ignorando ciò che è impostato nel file .profile.

Modifica: Ho anche verificato un paio di windows Linux di varie età e anche queste sembrano avere questo file, quindi questo probabilmente non è specifico per AIX.

L’ho verificato usando il suggerimento di cron di joemaller e controllando l’output prima e dopo aver modificato la variabile PATH in / etc / environment.

So che questo è già stato risolto, ma ho pensato che sarebbe stato utile per qualcuno. Ho avuto un problema simile che ho risolto di recente ( trovato qui ) e qui sono i punti salienti dei passaggi che ho preso per rispondere a questa domanda:

  1. assicurati di avere le variabili che ti servono in PYTHONPATH (trovato qui e qui e per maggiori informazioni qui) all’interno di .profile o .bash_profile per qualsiasi shell in cui vuoi testare il tuo script per assicurarti che funzioni.

  2. modifica il tuo crontab per includere le directory necessarie per eseguire il tuo script in un lavoro cron (trovato qui e qui)

    a) assicurati di includere la directory root nella variabile PATH (.) come spiegato qui (in pratica se stai eseguendo un eseguibile con il tuo comando deve essere in grado di trovare root o la directory in cui è archiviato l’eseguibile) e probabilmente questi (/ sbin: / bin: / usr / sbin: / usr / bin)

  3. nel tuo file crontab, crea un cronjob che cambierà la directory nella directory in cui hai eseguito correttamente lo script (cioè Users / user / Documents / foo)

    a) Questo sarà simile al seguente:

     * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 

Se non vuoi dover apportare le stesse modifiche in vari punti, procedi grosso modo in questo modo:

 * * * * * . /home/username/.bashrc && yourcommand all of your args 

Il . spazio e quindi il percorso per .bashrc e il comando && sono la magia per ottenere le modifiche dell’ambiente nella shell bash in esecuzione. Inoltre, se vuoi davvero che la shell sia bash, è una buona idea avere una linea nel tuo crontab:

 SHELL=/bin/bash 

Spero che aiuti qualcuno!

@Trevino: la tua risposta mi ha aiutato a risolvere il mio problema. Tuttavia, per un principiante, cercando di dare un approccio graduale.

  1. Ottieni la tua attuale installazione di java tramite $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH – questo ti permette di capire qual è il valore PATH usato da crontab al momento. Esegui crontab e prendi il valore $ PATH usato da crontab.
  4. Ora modifica nuovamente crontab per impostare il percorso java bin desiderato: a) crontab -e ; b) PATH=/bin:/usr/bin:/bin (è un percorso di esempio); c) ora il tuo lavoro programmato / script come */10 * * * * sh runMyJob.sh & ; d) rimuovere echo $PATH da crontab in quanto non è necessario ora.

Imposta il PATH richiesto nel tuo cron

 crontab -e 

Modifica: premi i

 PATH=/usr/local/bin:/usr/local/:or_whatever 10 * * * * your_command 

Salva ed esci :wq

Se si utilizza webmin questi sono i passaggi su come impostare il valore PATH :

 System -> Scheduled Cron Jobs -> Create a new environment variable -> For user: