Forum Webscript.Ru
Программирование => Perl => Тема начата: DimDim от 07 Мая 2003, 16:46:07
-
Есть такая проблема: Написана програмам сервер на Perl. Но из за сбоев в данных она время от времени подвисает. Хорошо бы ее рестартовать, допустим каждый час. Отсюда вытекает необходимость обрабатывать и посылать сигналы. Кто нибудь знает, как это делается?
Читал хелп - ничего не понял. Заранее спасибо за пример.
-
man cron
man crontab
-
Блин..
спасибо, помог...
тут можно сказать фразой из фильма: "если вы такие умные, то чего же строем не ходите?" без обид только, ок?
проблема не в кроне. Крон - это только способ запустить прогу, которая должна дать сигнал серваку. или сервак можно запустить с параметром. У меня проблема в событиях и сигналах.
-
DimDim тон смени, тебе а не мне совет нужен, и теперь по порядку все подробности.
Вот это на нормальный русский язык переведи: "Написана програмам сервер на Perl."
Я не понял что это предложение должно означать.
Далее, что за сервер что за ОС.
[OFF]Или тебя хеш %SIG интересует? Тогда в perldoc perlvar.[/OFF]
-
Да я же говорю, без обид... Конечно, речь идет именно об хеше %SIG Но вот в том то и беда, что не могу я послать сигнал процессу. Дело в том, что обращение KILL идет через pid, а я не понимаю, откуда вторая прога возьмет инфу о том pid. и вот тут то и весь затык.
Строго говоря, надо передать в процесс команду на перезагрузку.
обработчик я сделал - не велика мудрость, а вот как сигнал послать - это вопрос.
-
а, сори, сервер мой, написанный самолично, ничего сложного - подключается тунелем к сокету и сосет из него информацию, потом ее обрабатывает. все в реальном времени. Но вот если источник подвисает, вот тут и начинаются проблемы. дело в том, что программа дложна работать ВСЕГДА. а это не получается, она сбоит при любом сбое источника (сокет разрывается). А потом, на виртуальных хостах есть такая тенденция - админы пришибают слишком долго висящие процессы даже не разбираясь, а собственно говоря, что это такое. OC - FreeBSD 4.5
-
а разве коммандой ps
нельзя узнать pid ?
Уточню ps -axw
-
pid хранится в спец переменной $$.
Запиши в файл и обновляй номер при перезапуске сервера.
-
НЕ могу, к сожалению . Полностью все прикрыто. Это же не мой сервер, а виртуальный сервер.
ps: proc size mismatch (108120 total, 1056 chunks)
-
Проблема
При получении сигнала HUP сервер должен перезапускаться, по аналогии i inetd или httpd.
Решение
Перехватите сигнал SIGHUP и перезапустите свою программу:
$SELF.= "/usr/local/libexec/myd"; # Моя программа
@ARGS = qw(-l /var/log/myd -d); # Аргументы
$SIG{HUP} = \\&phoenix;
sub phoenix {
# Закрыть все соединения, убить потомков и
# приготовиться к корректному возрождению.
exec($SELF, OARGS) or die "Couldn\'t restart: $!\\n";
}
Внимание вопрос: как послать сигнал HUP процессу? Может ли он его посылать сам себе? если нет, то как это замутить?
-
DimDim
может вызывать kill из crontab\'а?
-
perldoc perlipc
Там очень хорошо все описано.