2013-02-20 16 views
15

Ho la seguente voce nel crontab:Reindirizzare l'output di un job cron

0 5 * * * /bin/bash -l -c 'export RAILS_ENV=my_env; cd /my_folder; ./script/my_script.rb 2>&1 > ./log/my_log.log' 

Il risultato di questo è che sto ricevendo l'uscita di ./script/my_script.rb in ./log/my_log.log. Questo comportamento è desiderato. La cosa curiosa è che sto ricevendo anche l'output nella mia posta locale. Mi chiedo come l'output del mio script venga catturato per posta. Dal momento che sto reindirizzando l'output in un file di log, mi aspetto che il mio lavoro cron non abbia output e quindi non riceverei mail quando viene eseguito il cron job. Qualcuno può far luce su come la posta è in grado di ottenere l'output di ./script/my_script.rb?

risposta

24

L'ordine di reindirizzamento non è corretto. Stderr non viene reindirizzato al file, ma viene inviato allo stdout. Questo è quello che devi ricevere nella tua posta.

Fissare il reindirizzamento cambiando il vostro lavoro cron:

0 5 * * * /bin/bash -l -c 
'export RAILS_ENV=my_env; 
cd /my_folder; 
./script/my_script.rb > ./log/my_log.log 2>&1' 
+8

N.B. puoi anche usare '&>' per reindirizzare entrambi contemporaneamente. Funziona in zsh e bash. – Kevin

+0

Avevo l'impressione che la mia sintassi reindirizzasse stderr a stdout e stdout al mio file di registro, no? Puoi spiegare un po 'di più? Grazie per l'aiuto. –

+2

Il tuo reindirizzamento stderr dovunque stdout stava andando (cioè/dev/stdout), e poi stdout al tuo file di registro. Stderr non cambia dopo il secondo reindirizzamento. Sta andando ancora a/dev/stdout. – dogbane

2

Provare a scambiare 2>&1 con > ./log/my_log.log.

+3

N.B. puoi anche usare '&>' per reindirizzare entrambi contemporaneamente. Funziona in zsh e bash. – Kevin

+3

@Kevin se si esegue questa operazione, è necessario impostare SHELL nel crontab in modo che sia bash, altrimenti verrà utilizzato (probabilmente) sh e non funzionerà – Squidly

1

A giudicare dalle this answer è sufficiente cambiare l'ordine dei redirect:

0 5 * * * /bin/bash -l -c 'export RAILS_ENV=my_env; cd /my_folder; ./script/my_script.rb > ./log/my_log.log 2>&1'