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

 
 
> Борьба с процессами зомби, Программирование под Линукс
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
Olej
сообщение Jan 24 2007, 16:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(snedelko @ Jan 23 2007, 12:13) *
А если процесс зомби, то потоки, запущенные им, тоже зомби? И вообще, тонкостей тут куча, где бы про это подробно почитать ?


Вопрос в общих контурах - понятный и описанный, а в деталях - заинтересовал...
Я тут набросал тест маленький, на скорую руку, который позволяет создавать "временных зомби", наблюдать их... (пример очень draft - писался на коленке - no comments):
Код
#include <signal.h>
#include <iostream>

using std::cout;
using std::endl;
using std::flush;

static const int MSG_BUF = 160;
static char msgbuf[ MSG_BUF ];
static char *puthead( void ) {
   struct timespec t;
   clock_gettime( CLOCK_REALTIME, &t );
   int sec = t.tv_sec % 60, min = t.tv_sec % 3600 / 60,
       ms = t.tv_nsec / 1000000, mks = t.tv_nsec % 1000000 / 1000;
   sprintf( msgbuf, "[%02d:%02d.%03d.%03d] %d: ", min, sec, ms, mks, getpid() );
   return msgbuf + strlen( msgbuf );
};

static void chend( int ) {
   sprintf( puthead(), "oh, my God - my child is dead!\n" );
   cout << msgbuf << flush;
};

int main( int argc, char* argv[] ) {
   int c, msec = 300, level = 0;
   while( ( c = getopt( argc, argv, "c:t:" ) ) != -1 ) {
      switch( c ) {
         case 'c': level = atoi( optarg ); break;
         case 't': msec = atoi( optarg ); break;
         default : exit( EXIT_FAILURE );
      };
   };
   signal( SIGCHLD, chend );
   pid_t id; // = -1;
   int w = 4, j = -1;
   while( --level > 0 && ( id = fork() ) == 0 ) { w += j; j = ( j < 0 ? 2 : -1 );  };
   sprintf( puthead(), "start - my parent is %d\n", getppid() );
   cout << msgbuf << flush;
   for( int i = 0; i < w; i++ )
      if( delay( msec ) != 0 ) --i;
      else {
         sprintf( puthead(), "continue %d - parent is %d\n", i + 1 , getppid() );
         cout << msgbuf << flush;
      };
   sprintf( puthead(), "finished\n" );
   cout << msgbuf << flush;
   exit( EXIT_SUCCESS );
};



а вот вариант его прогона:
Код
# ./zomby2 -c4 -t2000
[38:04.744.723] 6467647: start - my parent is 4710443
[38:04.746.723] 6471744: start - my parent is 6467647
[38:04.748.722] 6471745: start - my parent is 6471744
[38:04.748.722] 6471746: start - my parent is 6471745
[38:06.746.417] 6467647: continue 1 - parent is 4710443
[38:06.748.416] 6471744: continue 1 - parent is 6467647
[38:06.750.416] 6471745: continue 1 - parent is 6471744
[38:06.750.416] 6471746: continue 1 - parent is 6471745
[38:08.748.110] 6467647: continue 2 - parent is 4710443
[38:08.750.110] 6471744: continue 2 - parent is 6467647
[38:08.752.110] 6471745: continue 2 - parent is 6471744
[38:08.752.110] 6471746: continue 2 - parent is 6471745
[38:10.749.804] 6467647: continue 3 - parent is 4710443
[38:10.751.804] 6471744: continue 3 - parent is 6467647
[38:10.751.804] 6471744: finished
[38:10.752.804] 6467647: oh, my God - my child is dead!
[38:10.753.804] 6471745: continue 3 - parent is 6471744
[38:10.753.804] 6471746: continue 3 - parent is 6471745
[38:12.754.497] 6467647: continue 4 - parent is 4710443
[38:12.754.497] 6467647: finished
[38:12.755.497] 6471745: continue 4 - parent is 6471744
[38:12.755.497] 6471746: continue 4 - parent is 6471745
[38:12.755.497] 6471746: finished
[38:12.756.497] 6471745: oh, my God - my child is dead!
# [38:14.758.191] 6471745: continue 5 - parent is 1
[38:14.758.191] 6471745: finished

#

# pidin
6467647   1 ./zomby2            10o NANOSLEEP
6471744     (Zombie)
6471745   1 ./zomby2            10o NANOSLEEP
6471746   1 ./zomby2            10o NANOSLEEP

- проганял я, естественно wink.gif, не в Linux - но он весь - POSIX:­ вы
можете взять и поганять нечто подобное в вашей любимой ОС - он создаёт любое число процессов, каждый из которых может поочерёдно становиться зомби.

P.S. мне особенно понравился wink.gif цикл:
while( --level > 0 && ( id = fork() ) == 0 ) { w += j; j = ( j < 0 ? 2 : -1 ); };
- который циклом и не является ("... не верь глазам своим"(с) К.Прутков), и в каждом процессе выполняется по 1-й итерации этого "якобы цикла" ровно по 1-му разу : "цикл между процессами" wink.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:32
Рейтинг@Mail.ru


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