Russian Qt Forum
Сентябрь 29, 2024, 02:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как терминировать процесс со всеми его потомками в Linux(Mac)  (Прочитано 22292 раз)
ритт
Гость
« Ответ #15 : Июнь 25, 2009, 15:28 »

бла-бла-бла...
какое отношение данный тред имеет к Qt?
Записан
spectre71
Гость
« Ответ #16 : Июнь 25, 2009, 16:54 »

бла-бла-бла...
какое отношение данный тред имеет к Qt?
Ну прямого отношения может и не имеет.
Переписываю приложение с C++ Builder(Windows) на QT(Windows, Linux, Mac).
QProcess мне не обеспечивает необходимой фукциональности.
Под Windows проблема решена.
Необходимо решить для  Linux и Mac.
Записан
Blayder
Гость
« Ответ #17 : Июль 20, 2009, 00:41 »

Код:
killall -h
Usage: killall [OPTION]... [--] NAME...
       killall -l, --list
       killall -V, --version

  -e,--exact          require exact match for very long names
  -I,--ignore-case    case insensitive process name match
  -g,--process-group  kill process group instead of process
  -i,--interactive    ask for confirmation before killing
  -l,--list           list all known signal names
  -q,--quiet          don't print complaints
  -r,--regexp         interpret NAME as an extended regular expression
  -s,--signal SIGNAL  send this signal instead of SIGTERM
  -u,--user USER      kill only process(es) running as USER
  -v,--verbose        report if the signal was successfully sent
  -V,--version        display version information
  -w,--wait           wait for processes to die

man killall
Может это?
« Последнее редактирование: Июль 20, 2009, 00:44 от Blayder » Записан
spectre71
Гость
« Ответ #18 : Июль 20, 2009, 10:38 »

man killall
Может это?

Нет, почитай тему с начала.
Записан
Blayder
Гость
« Ответ #19 : Июль 20, 2009, 20:00 »

прочитал тему сначала...
например:

видим древо просессов запущенных от xdm и если сейчас выполнить команду, например:
killall -s 64 -g xdm
 - это отправит сигнал SIGKILL xdm'у и всем дочерним от него запущенным.
А то, как вы писали, что родительский процесс запускает дочерний и тут же сам завершается... Не делает ли это дочерний процесс уже родительским?
Ибо как ни крути, ведь все процессы являются дочерними для ini...

Может еще можно как-то мониторить /proc используя демон fam(file alteration monitor)... Ведь в /proc хранится вся инфа по процессам в директориях под названием PID каждого процесса...

Или всетаки каким-то образом мониторить древо процессов, используя, как вариант, команду:
ps axjf
Записан
spectre71
Гость
« Ответ #20 : Июль 20, 2009, 20:14 »

...
А то, как вы писали, что родительский процесс запускает дочерний и тут же сам завершается... Не делает ли это дочерний процесс уже родительским?
...
Читай внимательней, это уже обсуждалось!
Я уже писал про это выше, но повторю. В общем случае при мониторинге дочерних процессов можно пропустить нужный  интервал!
Один из примеров(подобных проблем несколько!)

Потомка еще нет.......
Мониторим......
Потомка еще нет.......
Мониторим......
Потомка еще нет.......
начало пропущенного интервала(между мониторингами) [
1) Родитель создал дочерний процесс
2) Родитель отвалился
3) Дочерний процесс перепривязался к ini
] конец пропущенного интервала
Потомка проморгали.......
Домониторились......
Записан
Blayder
Гость
« Ответ #21 : Июль 20, 2009, 20:34 »

я чет теряю мысль...
Вам надо было убить родителя и всех его потомков?
Или выслеживать когда и как родитель создает потомков?
был родитель и родил дочерний:
PID         NAME
1              ini
300          + родитель
320                +-- дочерний
родитель умер, остался дочерний:
PID         NAME
1              ini
320           +-- дочерний

разве дочерний не стал родителем?
Записан
spectre71
Гость
« Ответ #22 : Июль 20, 2009, 20:51 »

я чет теряю мысль...
Вам надо было убить родителя и всех его потомков?
Или выслеживать когда и как родитель создает потомков?
был родитель и родил дочерний:
PID         NAME
1              ini
300          + родитель
320                +-- дочерний
родитель умер, остался дочерний:
PID         NAME
1              ini
320           +-- дочерний

разве дочерний не стал родителем?


А откуда я узнаю PID  дочернего чтобы его убить если родитель родитель(какого либо уровня отвалился)?       
И схема не такая:

1              ini
280          + MyAPP - который создает родителя
300              + родитель
320                  +-- дочерний

При мониторенге можно проморгать дочерний, что недопустимо(одна из ситуаций описана выше)!
Записан
Blayder
Гость
« Ответ #23 : Июль 20, 2009, 21:24 »

ну мониторим мы древо:
первый снапшот дерева допустим имеет структуру:
PID         NAME
1              ini
280          + MyApp
300             + родитель

тут на монитор делает паузу и рождается дочерний и отмирает родитель:

PID         NAME
1              ini
280          + MyApp
320             + Дочерний

Врубается наш монитор и делает снапшот древа и видит, что новый снапшот не совпадает со старым, сопоставляет и видит - агаа...
Пропал процесс с пидом 300 и появился процесс с пидом 320...
Но в такой ситауции вы разумеется не будете знать откуда этот новый процесс породился... НО.. а надо оно вам?
пусть родиль нашей дочурки и пропал, однако ведь древо не изменилось - родитель у них так и остался MyApp... и при киле MyApp - умрет и дочурка...
Ну конечно, если случится неимоверное судо и дочурка не вырвется из MyApp и не прилипнет в ini...
Но даж в такой ситуации:
PID         NAME
1              ini
280          + MyApp
320          + Дочерний
Разве сравнив в спредыдущим снапшотом древа:
PID         NAME
1              ini
280          + MyApp
300             + родитель
мы не увидим, что изменилась связь в древе и пид 320 изменил своего родителя?
Непонимающий хотя откуда нам знать чей он аще был, если он изниоткуда вылез  Непонимающий
Хмм... тут в общем надо штудировать действия процессов и возможные исходы при смерти родителя... То, как он решает куда цепляться... К следущему родителю уровнем выше, либо же сразу к корню...
догадки, догадки...

П.С. может подскажите вариант как можно такое повидение сэмитировать? с радостьюб проверил и помог :-D
П.П.С. Сигнал pdeath_signal используется когда процесс лишается "родителя" (в случае его "смерти") и может быть получен/установлен посредством команд PR_GET/SET_PDEATHSIG системного вызова prctl(2) - http://www.opennet.ru/docs/RUS/lki/lki-2.html#ss2.2
« Последнее редактирование: Июль 20, 2009, 21:32 от Blayder » Записан
spectre71
Гость
« Ответ #24 : Июль 20, 2009, 21:33 »

Эсли бы было так, все было бы просто Улыбающийся
1              ini
280          + MyAPP - который создает родителя
300              + родитель
320                  +-- дочерний

если отваиться родитель то будет не так
1              ini
280          + MyAPP - который создает родителя
320              +-- дочерний

а так:

1              ini
280          + MyAPP - который создает родителя
320          + дочерний - (привязан к ini)

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #25 : Июль 20, 2009, 21:47 »

>>а так:
>>...
Это почему? недолжен процесс через дедушку к прадедушке перескакивать
Записан

Юра.
spectre71
Гость
« Ответ #26 : Июль 20, 2009, 22:05 »

>>а так:
>>...
Это почему? недолжен процесс через дедушку к прадедушке перескакивать
Он перескакивает не к прадедушке а к процессу "ini", есть такой в Unix. Под виндой примерно так же. Так сделаны операционки, не вдавался в подробности но видимо есть на то причины.
Записан
Blayder
Гость
« Ответ #27 : Июль 20, 2009, 23:00 »

Цитировать
Таким образом, все процессы в UNIX связаны отношениями процесс-родитель - процесс-ребенок, образуя генеалогическое дерево процессов. Завершение процессов в лекцииДля сохранения целостности генеалогического дерева в ситуациях, когда процесс-родитель завершает свою работу до завершения выполнения процесса-ребенка, идентификатор родительского процесса в данных ядра процесса-ребенка (PPID - Parent Process IDentificator) изменяет свое значение на значение 1, соответствующее идентификатору процесса init, время жизни которого определяет время функционирования операционной системы. Тем самым процесс init как бы усыновляет осиротевшие процессы. Наверное, логичнее было бы изменять PPID не на значение 1, а на значение идентификатора ближайшего существующего процесса-прародителя умершего процесса-родителя, но в UNIX почему-то такая схема реализована не была.
Да, вы были правы... при смерти родителя - дочерние сразу лепятся в иниту без вопросов "а кто там мой дедушка" и т.д.
http://cs.mipt.ru/docs/courses/osstud/03/prep/sem3-4.htm#s0304
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #28 : Июль 21, 2009, 00:56 »

Если бы в линукс был полный лог создания PID-ов(я не в курсе существует ли такой) то вам нужно было бы его использовать, тем не менее эта сложноватое решение на мой взгляд...
Может все же подойдет ситуация когда имеется список имен процессов кот. в определенный момент ищутся и прибиваются. Конечно так можно убить что-то лишнее что никогда родителем не создавалось.. Просто то чего не реализовали в ОС вам реализовывать в программе не самый простой путь...
« Последнее редактирование: Июль 21, 2009, 00:59 от break » Записан
spectre71
Гость
« Ответ #29 : Июль 21, 2009, 09:27 »

Просто то чего не реализовали в ОС вам реализовывать в программе не самый простой путь...

В виндах есть для этих целей(и не только для них) JobObject.
В Linux насколько понимаю что-то связанное с группами?
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.