2013-02-20 14 views
15

Mam następujący wpis w crontab:Przekierowanie wyjścia crona

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

Wynikiem tego jest to, że otrzymuję wyjście ./script/my_script.rb w ./log/my_log.log. Takie zachowanie jest pożądane. Co ciekawe, otrzymuję również dane wyjściowe w mojej lokalnej poczcie. Zastanawiam się, jak wyniki mojego skryptu są przechwytywane przez pocztę. Ponieważ przekierowuję dane wyjściowe do pliku logu, oczekiwałbym, że moje zadanie cron nie będzie miało wyjścia, a zatem nie otrzymam poczty po uruchomieniu zadania cron. Czy ktoś może rzucić trochę światła na to, jak poczta może uzyskać wyjście z ./script/my_script.rb?

Odpowiedz

24

Twoja kolejność przekierowań jest niepoprawna. Stderr nie jest przekierowywany do pliku, ale jest wysyłany na standardowe wyjście. To właśnie musisz odbierać w swojej poczcie.

Fix przekierowanie zmieniając crona do:

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. możesz również użyć '&>', aby przekierować obie naraz. Działa w zsh i bash. – Kevin

+0

Odnosiłem wrażenie, że moja składnia przekierowała stderr na stdout i stdout do mojego pliku logu, nie? Czy możesz wyjaśnić nieco dalej? Dzięki za pomoc. –

+2

Twój przekierowany stderr do miejsca, w którym działał stdout (tj./Dev/stdout), a następnie stdout do pliku logu. Stderr nie zmienia się po drugim przekierowaniu. Nadal będzie to/dev/stdout. – dogbane

2

Spróbuj wymieniać 2>&1 z > ./log/my_log.log.

+3

nb możesz również użyć '&>', aby przekierować obie naraz. Działa w zsh i bash. – Kevin

+3

@Kevin, jeśli to zrobisz, musisz ustawić SHELL w twoim crontabu na bash, w przeciwnym razie (prawdopodobnie) użyje sh i nie zadziała – Squidly

1

Sądząc this answer wystarczy przełączyć kolejność przekierowania:

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