реклама на сайте
подробности

 
 
> Борьба с процессами зомби, Программирование под Линукс
snedelko
сообщение Jan 20 2007, 20:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 17-02-06
Из: Харьков, Украина
Пользователь №: 14 419



Ситуация следующая: есть процесс, который запускается по автозапуску системы. Проблема: процесс при неизвесных обстоятельствах вылетает. Причины: разные java script:emoticon(':)', 'smid_2'). Возможно это утечка памяти, аппаратный сбой (программа работает с драйверами устройств), ошибка при работе с памятью и т. д. Мне нужно отследить "вылетание", и заново запустить программу. Я решил сделать это при помощи скрипта (см. влож. файл), который я поместил в автозапуск (вместо самой программы). Скрипт простой (напомню, что pidof - команда, которая возвращает pid процесса по имени, и если процесса нет, возвращает 0). Все работает, когда программы выходит по exit(0). Но вот при segmentation fault скрипт не помогает, так как процесс становиться зомби (т.е. имеет pid != 0).

Подскажите почему, или предложите свой вариант.
Прикрепленные файлы
Прикрепленный файл  smobi.rar ( 299 байт ) Кол-во скачиваний: 46
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
snedelko
сообщение Jan 23 2007, 11:13
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 17-02-06
Из: Харьков, Украина
Пользователь №: 14 419



А если процесс зомби, то потоки, запущенные им, тоже зомби? И вообще, тонкостей тут куча, где бы про это подробно почитать ?
Go to the top of the page
 
+Quote Post
733259
сообщение Jan 30 2007, 06:59
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



Может не в тему, но у меня нормально получалось следить, перезапускать процессы из perl, типа

foreach $pid(@processes){
if(waitpid($pid,WNOHANG)){

это я к тому, что дспетчер можно и на C написать, но скриптом быстрее, прблем меньше, ИМХО.

ЗЫ: пример, буквально за 3 минуты
Код
#! /usr/bin/perl -w

use strict;
use POSIX;

my $proc;
my @program = ("wget","-c","-t","1","-T","10",
"http://download.xilinx.com/direct/webpack/91/WebPACK_SFD_91i.zip");

unless($proc = fork()){
  exec(@program);
}

for(;;){
  if(waitpid($proc,WNOHANG)){
    if($? != 0){
      unless($proc = fork()){
        exec(@program);
      }
    }
  }
  select(undef,undef,undef,0.1);
}
wget просто так, ничего в голову не пришло

Сообщение отредактировал 733259 - Jan 30 2007, 07:34
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016