Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Зомби

283
02 апреля 2003 года
Alone
910 / / 20.11.2002
После всевозможных экспериментов (зачастую извращенных :) ) с много мерными масивами+хешами
Я увидел в списке процессов 10 штук зомби моего скрипта.
Сразу оговорюсь я fork не использовал и даже циклов которые могли зациклится.
Более того после мне так и не удалось выяснить из за чего не завершались процессы. Повтор экспирементов ни кчему не привел.

Так вот вопрос
как вы боритесь с зомби? (вариант с рихтовкой рук не предлогать :) хотя и понимаю что это ключевое )

Уточню
У меня колокейшин и никаких квот на выполнение скриптов там нет и вводится не будут
самое простое на мой взгляд указать максимальное время выполнения скрипта желательно в самом скрипте (PERL)...
но как?...
4
02 апреля 2003 года
mike
3.7K / / 01.10.2002
Очень странно. Зомби - это завершившийся поток, родитель которого не удосужился получить его статус.

Я борюсь так:

 
Код:
signal(SIGCHLD, &childhandler);


сам обработчик:

 
Код:
void childhandler(int signal) {
    waitpid(-1,NULL,WNOHANG);
    }


Это C есс-но.
283
02 апреля 2003 года
Alone
910 / / 20.11.2002
Я похоже несколько ввел вас в заблуждение
меня интересовало как прибить текущий процесс если он работает больше определенного времени

mike огромное спасибо вы мне напомнили что копать нужно в сигналах.
300
02 апреля 2003 года
ReDrum
689 / / 20.04.2000
Странно что зомби появляются вообще.

Если косвенно не вызывает форк или криво от терминала отваливается.

[quote]
меня интересовало как прибить текущий процесс если он работает больше определенного времени.
[quote]
system ("kill -9 'pid'");

вобщем давно я не читал
perldoc perlipc
283
02 апреля 2003 года
Alone
910 / / 20.11.2002
Цитата:
Originally posted by ReDrum
system ("kill -9 'pid'");

вобщем давно я не читал
perldoc perlipc



да не зачем так
как например pid узнать?

лучше почитать perldoc perlipc
мне лично помогло :)

300
02 апреля 2003 года
ReDrum
689 / / 20.04.2000
Цитата:
Originally posted by Alone


да не зачем так
как например pid узнать?



system("ps -axf | grep [path/there/yor/script/work]")

Тож вариант :)=
Типа лень читать.
Ну а место где скрипт лежит аналогичным макаром.

283
02 апреля 2003 года
Alone
910 / / 20.11.2002
фуф а я уже решил что в perl есть переменная каторя хранит pid текущего процесса :)

не всетаки придется читать мануалы :)
- может висеть несколько процессов какой из них твой тяжело определить
- да и потом нужно по таймеру убить себя а это опять сигналы и всетаки лезть в мануалы :)
300
02 апреля 2003 года
ReDrum
689 / / 20.04.2000
Цитата:
Originally posted by Alone
фуф а я уже решил что в 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.

283
02 апреля 2003 года
Alone
910 / / 20.11.2002
насчет $$ каюсь и все такое :)

а вот как остановить убить скрипт если он например зациклился в о одном месте?

Другими словами дать команду бросить все и самоустранится?

вот пример
while (1)
{
sleep (1);
}
как остановить этот цикл?

300
02 апреля 2003 года
ReDrum
689 / / 20.04.2000
Цитата:
Originally posted by Alone

а вот как остановить убить скрипт если он например зациклился в о одном месте?

Другими словами дать команду бросить все и самоустранится?

вот пример
while (1)
{
sleep (1);
}
как остановить этот цикл?



вариант по времени

 
Код:
my $const = 1000000;

while(1) {
  (int(time() - $^T) < $const) ? sleep() : last;  
}

Или опять вернуться к сигналам
while(1) {
(&check_sig()) ? sleep() : last;
}

sub check_sig {
здесь чего то будет проверятся
и возвращаться 0 - если нада выйти
1 - ненада
}

[/code]
283
02 апреля 2003 года
Alone
910 / / 20.11.2002
Во а теперь представь что у тебя куча таких циклов
да нет даже не циклов а комманд при выполнение которых произошел сбой системы и они зациклились и ты туда не сможеш поставить свой обработчик

я реализовал так

$SIG{ALRM} = sub { die "alarm\n" };
eval
{
alarm (5);
while (1){ sleep(1); }
alarm(0);
}
if ($@)
{
если остановленно по таймеру
}

сразу говорю взято из мануала :)

ReDrum очень расчитываю на ваши контр доводы и решения :)
как говорится флудить так флудить :)
300
03 апреля 2003 года
ReDrum
689 / / 20.04.2000
Можно и через eval забацать.
А, на спане, как то видал пакет (не Error.pm но что то похожее по названию) который позволяет перехватывать всякие исключения, в эаком Java стайле.

Но тока существует мнение, что использование eval замедляет выполнение скрипта. (на самом деле я не являюсь автором этого утверждения.)

ЗЫ. Так и не читал я доков. ж)=
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог