Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Чт Фев 28 2008 16:29 Заголовок сообщения: crontab (redirect stdout and stderr) |
|
|
Как перенаправить stdio и stderr задачи которая запускается crontab?
Скрипт csh(си шельный), когда его запускаю непосредственно с терминала то stdio и stderr перенаправляются в файл, а когда этот же скрипт запускается crontab'ом, то весь вывод stdio и stderr присылается по почте, и не попадает log файл. В скрипте запускается wget.
скрипты:
Код: | #!/bin/csh
#script for crontab
0 2 * * * run_wget_script 2 >> nohup.out
|
run_wget_script
Код: | #!/bin/csh
#run wget script
nohup wget -i url_file &
|
Как сделать, чтоб stdio и stderr перенаправлялись под crontab и не попадали в почтовое уведомление, а попадали в >> log_file?
(как управлять содержимым почтового уведомления crontab? )
(FreeBSD)
Спасибо. |
|
Вернуться к началу |
|
 |
VeL
Зарегистрирован: 18.01.2006 Сообщения: 521 Откуда: Харьков
|
Добавлено: Чт Фев 28 2008 21:02 Заголовок сообщения: Re: crontab (redirect stdout and stderr) |
|
|
А если попробовать сделать что то похожее на:
скрипты:
Код: | #!/bin/csh
#script for crontab
0 2 * * * run_wget_script
|
run_wget_script
Код: | #!/bin/csh
#run wget script
nohup wget -i url_file 2 >> nohup.out &
|
Работать будет интересно? _________________ Best regards |
|
Вернуться к началу |
|
 |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Чт Фев 28 2008 22:32 Заголовок сообщения: Re: crontab (redirect stdout and stderr) |
|
|
VeL писал(а): | А если попробовать сделать что то похожее на:
run_wget_script
Код: | #!/bin/csh
#run wget script
nohup wget -i url_file 2 >> nohup.out &
|
Работать будет интересно? |
wget воспримет 2 как параметр, перенаправления для crontab не получится, да и команда nohup ..&, предполагает по умолчанию перенаправление в nohup.out |
|
Вернуться к началу |
|
 |
Andrew Grekhov
Зарегистрирован: 29.06.2005 Сообщения: 200
|
Добавлено: Пт Фев 29 2008 06:54 Заголовок сообщения: Re: crontab (redirect stdout and stderr) |
|
|
Код: | #!/bin/csh
#run wget script
nohup wget -i url_file 2 >> nohup.out &
|
Зачем нужен "nohup"?
А чем не нравится:
Код: |
wget -b -i url_file -o log
|
|
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Пт Фев 29 2008 08:07 Заголовок сообщения: |
|
|
Давайте я поясню.
Набираем man bash и читаем раздел REDIRECTION
Там описано как осуществлять перенаправление потоков ввода, вывода и вывода потока ошибок. Каждому потоку присваетсся цифра (дескриптор).
0 - всегда относится к потоку ввода (stdin)
1 - всегда к потоку вывода (stdout)
2 - всегда к потоку ошибок (stderr)
Довольно часто приходится объединять поток вывода и поток ошибок в один поток. В случае с crontab это единственный вариант перенаправления данных в файл, т.к. crontab перехватывает поток вывода и поток ошибок и отправляет его в свой поток, из которого потом формирует эл.письмо о рез-тах работы команды. Резон такого поведения crontab-а есть, ведь он выполняет команду в фоновом режиме, а рез-ты вывода бывают ой как нужны.
Вот как это делать надо:
0 2 * * * run_wget_script 1>>nohup.out 2>&1 |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Пт Фев 29 2008 08:17 Заголовок сообщения: |
|
|
Про nohup:
Эта прога позволяет запустить скрипт или ПО и "оторвать" его от пользовательского терминала. Софт или скрипт будет продолжать выполняться даже если закрыть сессию SSH или даже консоль.
При запуске из crontab все и так запускается без привязки к терминалу. Поэтому применять в crontab-е nohup не имеет никакого смысла.
Еще раз, кто не понял. Поключаясь к терминалу запускается bash (sh, tcsh, ksh). Запуская из терминала ваши команды система ставит их в зависимость от того, откуда она была запущена. bash является родителем этих процессов. Если закрыть (убить) ваш процесс bash, то система уничтожит и все процессы, которые он породил.
nohup позволяет "оторвать" эту зависимость. Процесс пускается в "свободное" плаванье и становится независимым от родителя процессом. Или с точки зрения системы он такой же, как и ftpd, named, sshd...
Понятно о чем я? |
|
Вернуться к началу |
|
 |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Пт Фев 29 2008 09:02 Заголовок сообщения: |
|
|
and3008 писал(а): | Про nohup:
Эта прога позволяет запустить скрипт или ПО и "оторвать" его от пользовательского терминала. Софт или скрипт будет продолжать выполняться даже если закрыть сессию SSH или даже консоль.
При запуске из crontab все и так запускается без привязки к терминалу. Поэтому применять в crontab-е nohup не имеет никакого смысла.
Еще раз, кто не понял. Поключаясь к терминалу запускается bash (sh, tcsh, ksh). Запуская из терминала ваши команды система ставит их в зависимость от того, откуда она была запущена. bash является родителем этих процессов. Если закрыть (убить) ваш процесс bash, то система уничтожит и все процессы, которые он породил.
nohup позволяет "оторвать" эту зависимость. Процесс пускается в "свободное" плаванье и становится независимым от родителя процессом. Или с точки зрения системы он такой же, как и ftpd, named, sshd...
Понятно о чем я? |
Конечно понятно, явно непонятно о чем я :).
У меня есть скрипт с nohup, где wget запускается, часто запускаю я его с терминала(потом выхожу), этот скрипт меня полностью устраивает(перенаправляется весь лог в файл за счет nohup), я добавил еще crontab скрипт который запускает этот скрипт (зачем плодить еще скрипт, хочется использовать то, что уже работает ). А crontab перехватывает stdio stderr и не дает их nohup. Весь лог присылается письмом crontab, лог бывает большой, хочется сделать чтоб crontab присылал только уведомление, о том что задание запустил(например с логом 0/1 успешно/ошибка)), а не "забирал" stdio stderr у nohup, тем более, что копия лога crona должна быть еще
/var/log/cron. |
|
Вернуться к началу |
|
 |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Пт Фев 29 2008 10:55 Заголовок сообщения: |
|
|
and3008 писал(а): | Давайте я поясню.
...(skipped)
Вот как это делать надо:
0 2 * * * run_wget_script 1>>nohup.out 2>&1 |
попробывал я так , ругается cron(вернее это си-шелл ) :
Код: | Ambiguous output redirect. |
ну и далее вываливается, и скрипт не запускает.
( кажется такая запись (2>&1) катит только для /bin/sh
а си-шелл такого не понимает)
---
добавлено:
так как си шелл не понимает (2>&1)
пришлось делать так:
Код: | echo "run_wget_script >>nohup.out 2>&1" |sh |
криво конечно, но как-то работает(добавляется в nohup.out)
Последний раз редактировалось: atlantic (Пт Фев 29 2008 12:32), всего редактировалось 3 раз(а) |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Пт Фев 29 2008 11:38 Заголовок сообщения: |
|
|
Покажите сюда результат команды env |
|
Вернуться к началу |
|
 |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Пт Фев 29 2008 11:53 Заголовок сообщения: |
|
|
and3008 писал(а): | Покажите сюда результат команды env |
какая переменная интересует?(а то там много лишнего)
p.s.
я и использовал си-шелл, потому- что это мой логин-шел, там в .cshrc прописаны все пути настройки итд, а в .shrc обычно "фонарь"
еще раз проверил, вроде cron больше не присылает stderr
помогло так:
echo "run_wget_script >>nohup.out 2>&1" |sh
интересно, а как в си-шелл сделать 2>&1 , или там такое не катит? |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Пт Фев 29 2008 20:18 Заголовок сообщения: |
|
|
Ну а что за версия UNIX у вас?
sh от Linux, Solaris, FreeBSD, Tru64 имеют отличия.
В env интересовала переменная SHELL. |
|
Вернуться к началу |
|
 |
atlantic
Зарегистрирован: 28.02.2008 Сообщения: 6
|
Добавлено: Пт Фев 29 2008 22:46 Заголовок сообщения: |
|
|
and3008 писал(а): | Ну а что за версия UNIX у вас?
sh от Linux, Solaris, FreeBSD, Tru64 имеют отличия.
В env интересовала переменная SHELL. |
да вроде писал в самом первом посте, уточняю:
FreeBSD 6.3-PRERELEASE (SPIRIT)
а си-шелл(в котором работаю)
> tcsh --version
tcsh 6.14.00 (Astron)
options wide,nls,dl,al,kan,rh,color,filec
а насчет sh: у него бывает версия?(если да, то как посмотреть?)
в man'е на sh:
DESCRIPTION
The sh utility is the standard command interpreter for the system. The
current version of sh is in the process of being changed to conform with
the IEEE Std 1003.2 (``POSIX.2'') specification for the shell. This ver-
sion has many features which make it appear similar in some respects to
the Korn shell, but it is not a Korn shell clone like pdksh. Only fea-
tures designated by POSIX, plus a few Berkeley extensions, are being
incorporated into this shell. This man page is not intended to be a
tutorial nor a complete specification of the shell. |
|
Вернуться к началу |
|
 |
and3008
Зарегистрирован: 12.10.2001 Сообщения: 14893 Откуда: Н.Новгород
|
Добавлено: Сб Мар 01 2008 09:26 Заголовок сообщения: |
|
|
Рецепт из книжки "UNIX: The Complete Reference, Second Edition".
В bash, sh, ksh перенаправление потока ошибок в стандартный поток вывода делается конструкцией 2>&1
В csh, tcsh такой фокус не проходит. Файл для потока ошибок и файл для стандартного вывода должны быть разными файлами.
Пример:
(ls -l > /dev/tty) >& errorfile
stdout вывалится в консоль, а ошибки в файл errorfile
Однако если почитать документацию, то можно подумать, что можно сделать финт ушами. Типа так:
(ls -l > myfile) >>& myfile
Опасность сего поведения в том, что если пойдут сперва ошибки, то они запишутся в файл, а вот попытка создать файл для потока вывода окончится неудачно и команда не выполнится. Это мое IMHO, я его не проверял. Кому интересно, проверьте.
Когда-то давным давно оболочка у UNIX-ов была одна и называлась наверно sh. Потом любимые shell-ы стали отличаться. Но чтобы не путаться в системе всегда имется симлинк sh -> любимый шелл.
В Linux это bash, в Tru64 это ksh, в BSD это tcsh. |
|
Вернуться к началу |
|
 |
|