Зомби
Я увидел в списке процессов 10 штук зомби моего скрипта.
Сразу оговорюсь я fork не использовал и даже циклов которые могли зациклится.
Более того после мне так и не удалось выяснить из за чего не завершались процессы. Повтор экспирементов ни кчему не привел.
Так вот вопрос
как вы боритесь с зомби? (вариант с рихтовкой рук не предлогать :) хотя и понимаю что это ключевое )
Уточню
У меня колокейшин и никаких квот на выполнение скриптов там нет и вводится не будут
самое простое на мой взгляд указать максимальное время выполнения скрипта желательно в самом скрипте (PERL)...
но как?...
Я борюсь так:
Код:
signal(SIGCHLD, &childhandler);
сам обработчик:
Код:
void childhandler(int signal) {
waitpid(-1,NULL,WNOHANG);
}
waitpid(-1,NULL,WNOHANG);
}
Это C есс-но.
меня интересовало как прибить текущий процесс если он работает больше определенного времени
mike огромное спасибо вы мне напомнили что копать нужно в сигналах.
Если косвенно не вызывает форк или криво от терминала отваливается.
[quote]
меня интересовало как прибить текущий процесс если он работает больше определенного времени.
[quote]
system ("kill -9 'pid'");
вобщем давно я не читал
perldoc perlipc
Цитата:
Originally posted by ReDrum
system ("kill -9 'pid'");
вобщем давно я не читал
perldoc perlipc
system ("kill -9 'pid'");
вобщем давно я не читал
perldoc perlipc
да не зачем так
как например pid узнать?
лучше почитать perldoc perlipc
мне лично помогло :)
Цитата:
Originally posted by Alone
да не зачем так
как например pid узнать?
да не зачем так
как например pid узнать?
system("ps -axf | grep [path/there/yor/script/work]")
Тож вариант :)=
Типа лень читать.
Ну а место где скрипт лежит аналогичным макаром.
не всетаки придется читать мануалы :)
- может висеть несколько процессов какой из них твой тяжело определить
- да и потом нужно по таймеру убить себя а это опять сигналы и всетаки лезть в мануалы :)
Цитата:
Originally posted by Alone
фуф а я уже решил что в perl есть переменная каторя хранит pid текущего процесса :)
не всетаки придется читать мануалы :)
- может висеть несколько процессов какой из них твой тяжело определить
- да и потом нужно по таймеру убить себя а это опять сигналы и всетаки лезть в мануалы :)
фуф а я уже решил что в perl есть переменная каторя хранит pid текущего процесса :)
не всетаки придется читать мануалы :)
- может висеть несколько процессов какой из них твой тяжело определить
- да и потом нужно по таймеру убить себя а это опять сигналы и всетаки лезть в мануалы :)
не ну ты меня вынудил залезть в доки. ;)=
но немного не в те.
perldoc perlvar говорит
$$
The process number of the Perl running this script. You should consider this variable read-only, although it will be altered across fork() calls. (Mnemonic: same as shells.)
$^T
The time at which the program began running, in seconds since the epoch (beginning of 1970). The values returned by the -M, -A, and -C filetests are based on this value.
а вот как остановить убить скрипт если он например зациклился в о одном месте?
Другими словами дать команду бросить все и самоустранится?
вот пример
while (1)
{
sleep (1);
}
как остановить этот цикл?
Цитата:
Originally posted by Alone
а вот как остановить убить скрипт если он например зациклился в о одном месте?
Другими словами дать команду бросить все и самоустранится?
вот пример
while (1)
{
sleep (1);
}
как остановить этот цикл?
а вот как остановить убить скрипт если он например зациклился в о одном месте?
Другими словами дать команду бросить все и самоустранится?
вот пример
while (1)
{
sleep (1);
}
как остановить этот цикл?
вариант по времени
Код:
my $const = 1000000;
while(1) {
(int(time() - $^T) < $const) ? sleep() : last;
}
while(1) {
(int(time() - $^T) < $const) ? sleep() : last;
}
Или опять вернуться к сигналам
while(1) {
(&check_sig()) ? sleep() : last;
}
sub check_sig {
здесь чего то будет проверятся
и возвращаться 0 - если нада выйти
1 - ненада
}
[/code]
да нет даже не циклов а комманд при выполнение которых произошел сбой системы и они зациклились и ты туда не сможеш поставить свой обработчик
я реализовал так
$SIG{ALRM} = sub { die "alarm\n" };
eval
{
alarm (5);
while (1){ sleep(1); }
alarm(0);
}
if ($@)
{
если остановленно по таймеру
}
сразу говорю взято из мануала :)
ReDrum очень расчитываю на ваши контр доводы и решения :)
как говорится флудить так флудить :)
А, на спане, как то видал пакет (не Error.pm но что то похожее по названию) который позволяет перехватывать всякие исключения, в эаком Java стайле.
Но тока существует мнение, что использование eval замедляет выполнение скрипта. (на самом деле я не являюсь автором этого утверждения.)
ЗЫ. Так и не читал я доков. ж)=