Come impostare correttamente un processo di cron di root

22

Ho provato a impostare un processo cron di root per eseguire uno script Bash come root, da eseguire al minuto 7,37, ogni ora, ogni giorno del mese, ogni mese. Questo script si trova in /usr/bin e denominato tunlrupdate.sh . Aggiorna il DNS di Tunlr.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Questo script Bash è disponibile qui .

Quando viene invocato lo script scrive ciò che accade in un registro situato in /var/log/tunlr.log

Per aggiungere questo lavoro cron di root ho usato lo standard per crontab di root

sudo crontab -e

E ha inserito queste 2 righe alla fine. Mi aspetto che cron esegua lo script come root.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Un comando successivo sudo crontab -l ha confermato che il processo cron è stato inserito.

Ho riavviato Ubuntu e stavo controllando il file di log se il cron job era stato avviato correttamente. Tuttavia non c'è nulla nel file di registro /var/log/tunlr.log che significa che il lavoro non è mai stato lanciato con successo.

Ho verificato che se eseguo lo script dalla riga di comando

sudo /usr/bin/tunlrupdate.sh

quindi il file di registro viene aggiornato di conseguenza.

Perché questo cron job non funziona come previsto nel mio sistema?

AGGIORNAMENTO 1: tutte le soluzioni proposte finora non funzionano. Ringrazio Olli per una CLI per elencare il log di sistema sudo grep CRON /var/log/syslog . Tuttavia ho ricevuto un errore CRON

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

con il PATH suggerito = inserimento & amp; utilizzo del percorso assoluto da root per le funzioni nello script o senza le soluzioni suggerite qui. Ricevo ancora questo errore.

Dopo alcune ricerche ho individuato l'errore nel file /usr/lib/php5/maxlifetime come spiegato qui : Change #!/bin/sh -e --> #!/bin/sh -x

Quindi elencando il log degli errori CRON nel mio sistema

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Non riesco ancora a eseguire lo script di bash. Questa volta non viene mostrato alcun errore nel registro. Per avere la certezza che questo non era il contenuto dello script ho ridotto lo script alle seguenti 3 righe:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Non riesco ancora a ottenere il cron job. Nulla è scritto nel file di registro. Quindi anche potrebbe essere uno script vuoto non verrà eseguito in cron? Non capisco So di provare uno script ridotto a queste 2 righe:

#!/bin/bash
exit 0

E ancora lo stesso log degli errori. Lo script cron non passa attraverso ...

    
posta Antonio 11.02.2014 - 19:01
fonte

5 risposte

6

Bene, finalmente la soluzione di lavoro. Nel syslog ho visto il ripetitivo e intrigante:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Sembra che root non sia riconosciuto come un cmd. Come ho già usato il cron di root usando $ sudo /usr/bin/tunlrupdate.sh . Poi ho provato con lo script originale (corretto per un errore nella data UNIX cmd:% m che è stato utilizzato per i minuti che è% M) il seguente (che rimuove la root dalla linea cron):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Questa risultò essere la soluzione finale. [Anche se ho trovato decine di pubblicazioni che indicano la linea errata con root nella cron line. È stato un errore].

    
risposta data Antonio 12.02.2014 - 02:12
fonte
51

Se vuoi eseguire uno script come utente normale :

crontab -e

E aggiungi la linea:

07,37 * * * * /usr/bin/tunlrupdate.sh

Se vuoi eseguire il tuo script come root :

sudo crontab -e

E aggiungi la stessa linea:

07,37 * * * * /usr/bin/tunlrupdate.sh
    
risposta data Guillaume 26.09.2014 - 14:01
fonte
2

Un "problema" con cron è la mancanza di variabili di ambiente (per ragioni di sicurezza ovvio ). Probabilmente mancherai PATH e HOME. Puoi definire quelli nello script direttamente o nel file crontab.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Dovrai testare fino a quando tutte le variabili necessarie non saranno definite come richiesto dallo script.

    
risposta data Alexis Wilke 11.02.2014 - 19:47
fonte
0

I messaggi di errore cron solitamente sono - per impostazione predefinita - inviati via email. Puoi controllare se c'è una email per root con sudo mail , o semplicemente controllando il contenuto di /var/mail/root , ad esempio sudo less /var/mail/root .

Se i messaggi di posta elettronica non aiutano, controlla anche /var/log/syslog :

sudo grep CRON /var/log/syslog

Come ha già detto Alexis Wilke, cron ha diversi meccanismi per impostare le variabili di ambiente.

Lo script richiede

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

al crontab. HOME non dovrebbe essere necessario. Dovresti utilizzare percorsi assoluti nei tuoi script, ad esempio /bin/date anziché date . Puoi trovare percorsi corretti per ciascun comando con which command_name , ad es.

$ which date
/bin/date
    
risposta data Olli 11.02.2014 - 20:09
fonte
0

Puoi aggiungere questa linea nel tuo script. Quindi, dopo aver controllato i registri cron e compreso che il tuo lavoro è stato eseguito, puoi ottenere lo stesso $ PATH di crontabs.

/bin/echo $PATH > /root/path.txt

E probabilmente la cosa migliore che puoi fare per diagnosticare problemi negli script di cron è ottenere tutte le variabili di ambiente di SO con il comando env nel tuo script. Quindi aggiungi questa linea al tuo script. Quindi puoi analizzare l'output allEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

Un altro trucco consiste nel dirigere l'output dello script in qualche posto. Aggiungere /root/log.log . In questo modo tutti gli output dello script saranno mantenuti in /root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Inoltre puoi programmare lo script per eseguire ogni minuto per facilitare i test e i controlli.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
    
risposta data Cassio Seffrin 01.06.2015 - 03:54
fonte

Leggi altre domande sui tag