Форум системных администраторов

IT => Unix => Тема начата: Lexus1990 от 15 июля 2011, 12:19:46

Название: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 15 июля 2011, 12:19:46
*/2 * * * * a=''; a=`ps axl | grep import_sunmar_price.ph[p] | awk {'print $3'}`; if [ -z $a ]; then echo 'restart'; exec /var/www/gate-32/htdocs/bitrix/crontab/sunmar_list_index; else echo 'work'; fi

Есть вот такой вызов по крону скрипта (если процесс не запущен, то запускать). Скрипт скачивает с ftp файл и парсит его. После выполнения Записывается в базу время начала и время конца скрипта. Он идет около 10 мин. Поставил его вечером, статистика такая:
Выполнялся каждые 10 мин, примерно до часа ночи. Запись о том, что скрипт закончился есть. Далее процесс запуска крона почему-то остановился. Записей больше не было. Проснулся утром - в htop процесса нет (делаю от root). Запустил его вручную - процесс пошел. Опять каждые 10 мин. Если бы не было связи с ftp - скрипт сам бы начал запускаться после "поднятия" ftp. А я его запускал вручную - что может быть? И как протестировать причины? (оповещение на мыло с крона поставить пробовал - письма не приходят)
Лог пишет:
Jul 15 02:14:01 unknown-6335 crond[30195]: (root) CMD (a=''; a=`ps axl | grep import_sunmar_price.ph[p] | awk {'print $3'}`; if [ -z $a ]; then echo 'restar$ - показывает, запись (в таблице нет записи о выполнении) - т.е. после прохождения скрипта полюбому делается запись о выполнении в бд. Как могло произойти то, что записис в бд нет - скачанных данных нет (файл качает данные). Правильный ли синтаксис

Мне кажется, что может быть проблема в инструкции. можно ли как-то написать инструкцию так, чтобы он проверял - например, если процесс идет больше 20 мин, то kill процесс?
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 15 июля 2011, 12:39:46
Ну во-первых - что за ОС.
Второе -
ps axl | grep чтототам
с большой вероятностью поймает сам процесс grep.
Ну и третье - не легче ли всё это собрать в один скрипт на bash к примеру, с логированием куда-нить?
можно ли как-то написать инструкцию так, чтобы он проверял - например, если процесс идет больше 20 мин, то kill процесс?
Только другой программой-мониторилкой. Или делать многопоточный/многопроцессный скрипт, что сложнее.
Название: Re: Cron перестает запускать процесс.
Отправлено: rjhdby от 15 июля 2011, 13:04:28
с большой вероятностью поймает сам процесс grep.
99% что проблема именно в этом
Делать надо так:
ps axl | grep чтототам | grep -v grep
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 15 июля 2011, 13:07:54
Делать надо так:
ps axl | grep чтототам | grep -v grep
Практически везде уже есть pgrep. Рекомендовано использовать его.
Название: Re: Cron перестает запускать процесс.
Отправлено: rjhdby от 15 июля 2011, 13:14:30
Практически везде уже есть pgrep.
Однако не везде. Я вообще сторонник чистого posix в shell скриптовании. Оно как-то переносимее получается.
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 15 июля 2011, 13:21:51
ОС - Free bsd
Если процесс продолжал выполяться - могло ли это не отображаться в htop?
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 15 июля 2011, 13:27:22
Практически везде уже есть pgrep.
Однако не везде. Я вообще сторонник чистого posix в shell скриптовании. Оно как-то переносимее получается.
Тогда надо не ps ax а таки ps -ax  ;)
ОС - Free bsd
Если процесс продолжал выполяться - могло ли это не отображаться в htop?
Нет. Но в целой куче процессов в htop можно легко не заметить нужный процесс.
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 09:41:41
Я искал его по поиску. Вот опять у меня завис процесс - ночью) Скрипт выполняет запись из одной таблицы в другую - т.е. с др. серверами не связан. Что можно сделать, если процесс завис? (автоматизированно - чтобы сам завершался) - Очень хотелось бы получить синтаксис, если это можно прописать через bush скрипт или в инструкции крона
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 09:43:09
Тьфу - всмысле shell скрипт
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 18 июля 2011, 09:48:25
Что можно сделать, если процесс завис?
Зависит от того, в каком статусе он завис. Возможно происходят блокировки в базе, тогда сам процесс скрипта убить можно, а вот запрос просто так без перезапуска СУБД не факт.
А вообще - побольше конкретики. Иначе разговор получается о каких-то сферических скриптах в вакууме, которые зависают в непонятном состоянии  :D
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 11:50:42
База скорее всего не блокируется - т.к. после завершения процесса он запускается и идет нормально. Могу кинуть сюда файл скрипта, только вот не знаю - пригодится ли он))
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 18 июля 2011, 11:57:53
Lexus1990, кидай, посмотрим.
И полезным делом будет допилить в скрипте логирование и посмотреть в каком таки месте затык. гадать конечно можно, но не факт что угадаешь верно ;)
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 12:06:47
Вот скрипт, который переписывает из одной базы в другую записи) Вроде ничего сложного (при этом сравнивает с инфоблоками из битрикс). Переименуй файлик как скачаешь в php
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 18 июля 2011, 12:36:26
Lexus1990, битрикс такой битрикс  :facepalm2:
Советую повставлять в код вывод всякого дебага - типа контрольных точек. К примеру
echo "Checkpoint 1";
...
...
echo "Checkpoint 2";
...
и сделать перенаправление вывода скрипта  куда-то в /tmp/script.out
exec /var/www/gate-32/htdocs/bitrix/crontab/sunmar_list_index 2>&1 >> /tmp/script.out;
И когда залипнет - посмотреть до какого места скрипт доработал.
Битрикс он может составить достаточно дикий запрос...
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 12:54:36
Т.е. вы предлагаете поставить контрольные точки, и, например, писать их в файл? (или в базу) - и отследить на каком месте остановился скрипт?
Название: Re: Cron перестает запускать процесс.
Отправлено: VanDyke от 18 июля 2011, 13:01:40
писать их в файл? (или в базу
только в файл. В базу может не пройти запись, если проблема с базой.
Как минимум будет известен кусок кода, который зависает. А дальше уже по ходу дела...
Название: Re: Cron перестает запускать процесс.
Отправлено: Lexus1990 от 18 июля 2011, 15:05:48
хорошо - спасибо!
Название: Re: Cron перестает запускать процесс.
Отправлено: boykov от 20 июля 2011, 20:28:46
извиняюсь, что лезу, но во фряхе есть прекрасный порт monit