2013-02-20 4 views
15

У меня есть следующая запись в кронтабе:Перенаправление вывода в хронах

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

Результат этого является то, что я получаю выход ./script/my_script.rb./log/my_log.log в. Такое поведение желательно. Любопытно, что я также получаю вывод в своей местной почте. Мне интересно, как вывод моего сценария записывается по почте. Поскольку я перенаправляю вывод в файл журнала, я бы ожидал, что мое задание cron не будет выводиться, и, таким образом, я не получил бы почту, когда будет выполняться задание cron. Может ли кто-нибудь пролить свет на то, как почта может получить вывод ./script/my_script.rb?

ответ

24

Ваш неправильный порядок перенаправления. Stderr не перенаправляется в файл, а отправляется на stdout. Это то, что вы должны получать по почте.

Закрепить переназначение, изменив хроны на:

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. вы также можете использовать '&>' для перенаправления обоих одновременно. Он работает в zsh и bash. – Kevin

+0

У меня создалось впечатление, что мой синтаксис перенаправлен stderr в stdout и stdout в файл журнала, нет? Не могли бы вы объяснить немного дальше? Спасибо за помощь. –

+2

Ваш перенаправленный stderr туда, куда шел stdout (т. Е./Dev/stdout), а затем stdout в файл журнала. Stderr не изменяется после второго перенаправления. Он по-прежнему будет/dev/stdout. – dogbane

2

Попробуйте заменить 2>&1 на > ./log/my_log.log.

+3

нотабене вы также можете использовать '&>' для перенаправления обоих одновременно. Он работает в zsh и bash. – Kevin

+3

@Kevin, если вы это сделаете, тогда вы должны установить SHELL в своем crontab как bash, иначе он (вероятно) будет использовать sh, и не сработает – Squidly

1

Судя по this answer вам просто нужно изменить порядок редиректов:

0 5 * * * /bin/bash -l -c 'export RAILS_ENV=my_env; cd /my_folder; ./script/my_script.rb > ./log/my_log.log 2>&1' 
Смежные вопросы