Come reindirizzare l'output su un file da cron?


105

Ho uno script di backup che devo eseguire in una determinata ora del giorno, quindi sto usando cronper questa attività e da cron sto anche cercando di reindirizzare l'output dello script di backup su logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Nella precedente voce cron sto reindirizzando entrambi stderr and stdouta un file di registro.

Il precedente cron job viene eseguito correttamente in base a syslog ed esegue l'attività menzionata nel backup.shfile ma non scrive nulla nel file di registro.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Quando eseguo lo script da cli funziona come richiesto e l'output viene scritto in un file di registro

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Quindi, perché l'output del file non viene reindirizzato al file da cron.


Risposte:


158

Ho risolto il problema Ci sono due modi:

M1

Cambia il reindirizzamento da &>>a 2>&1. Quindi ora crontab -esembra

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Credo che quanto sopra funzioni perché per impostazione predefinita cronsta usando shper eseguire l'attività invece di bashcosì &>>non è supportato da sh.

M2

Modifica la shell predefinita aggiungendo SHELL=/bin/bashil crontab -efile.


14
cronè come sh: non seleziona un singolo programma. Ci sono molte implementazioni. L'implementazione più diffusa è Vixie cron. Sono l'autore (attuale, non l'originale) di un altro. Credo che la maggior parte dei demoni cron utilizzerà il sistema sh, ma ciò può variare se accetta &>>. Alcuni demoni cron (come il mio) non ti permettono di cambiare quale shell esegue le linee cron con SHELL=...linee nel crontab. Sono contento che tu abbia trovato una soluzione che funziona per te; ho solo pensato che valesse la pena sottolineare che ci sono molte variabili che potrebbero influenzare se funziona per gli altri.
dubiousjim,

Come inserire YYYY-MM-DD_hh-mm-secnel nome del file di output, in modo che ogni nome di file sia diverso e conservato senza riscriverlo?
Danijel,

1
@Danijel: questo dovrebbe aiutare serverfault.com/questions/117360/…
RanRag

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logfa anche la stessa cosa.
Yanick Girouard,

5

dichiarazione di non responsabilità [1].

Vorrei aggiungere una nota a piè di pagina o un addendum alla risposta di @ RanRag .

Assicurarsi che la sintassi di reindirizzamento della shell sia conforme /bin/sh. Se si tenta di utilizzare una sintassi di reindirizzamento della shell non valida, /bin/shil comando non verrà eseguito e il processo cron non verrà mai eseguito.

Nei tuoi /etc/cron.d/example1file di configurazione se specifichi un utente diverso da quello roote la shell di login dell'utente non è /bin/bash... devi comunque usare la sintassi / bin / sh nel /etc/cron.d/example1comando.


Per esempio

Se il tuo utente ha una shell csho zsho kshimpostato per la sua shell di accesso. Nel /etc/cron.d/example1file di configurazione, il comando deve utilizzare la /bin/shsintassi. In particolare qualsiasi reindirizzamento della shell deve essere /bin/shsintassi.

Se si tenta di utilizzare ad esempio la cshsintassi di reindirizzamento della shell nella propria /etc/cron.d/example1, il processo cron non verrà mai eseguito. Il file di log per crondubicato in /var/log/crondeve indicare che il comando è stato eseguito ma il comando verrà eliminato con un errore di sintassi prima dell'esecuzione del comando.

Dove vengono crondemessi i messaggi di errore per un errore di sintassi?

L'errore non è mai stato segnalato in /var/log/cron. crondinvece per impostazione predefinita emette eventuali messaggi di errore utilizzando mail. Quindi è necessario controllare /var/spool/mail/${USER}per vedere qual è l'errore.

[1]

Clausola di esclusione della responsabilità

  • Questa risposta presuppone un sysvsistema
  • systemd le informazioni possono differire
  • Nello specifico, queste informazioni sono state apprese per la centos-6distribuzione e potrebbero non essere applicabili a diverse sysvdistribuzioni
    • Cito in centos-6particolare, perché diverse distro possono avere crondun'implementazione diversa che differisce dacentos-6

2
se si desidera che il /etc/cron.d/example1comando utilizzi una shell diversa, è possibile utilizzare set SHELL=nel /etc/cron.d/example1file di configurazione.
Trevor Boyd Smith,
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.