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

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

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

Есть приложение запускающее процессы(различные консольные программы) из под себя.
Процесс запускаемый непосредственно данным приложением будем называть Родительским.
Родительским процесс в свою очередь может запускать из-под себя другие процессы, которуе в свою очередь так же могут запускать процессы,
назовем все процессы порожденные Родительским прямо или косвенно Дочерними.
Приложению не известно создаются ли Дочернии процессы Родительским.

Приложение в любой момент может убить Родительский процесс. Задача убить все его Дочернии процессы.

Под Windows данная задача решена. Создаем JobObject (CreateJobObject(...)), далее после создания Родительского процесса в SUSPENDED режиме делаем AssignProcessToJobObject, и делаем ResumeThread для гланого потока Родительского процесса. Теперь если наш Родительский процесс породит какие-либо Дочернии процессы, они будут автоматически ассоциированы с JobObject. Теперь при терминировании JobObject все ассоциированные с ним процессы будут терминированы! Причем вне зависимости завершился ли Родительский процесс или завис или еще чего.

Как решить эту задачу под Linux(Mac) я не нашел. Может в Linux(Mac) вообще такой возможности нет?
Помогите знающие люди!

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июнь 25, 2009, 11:25 »

в линуксе есть такая штука как "группа", причем, если мне не изменяет память то сигнал рассылается всей группе => нужно слать сигнал родителю (если надо, могу откопать коды 2ого курса где нас учили работать с процессами, если помнится то в shell'е, к-ый нас заставляли писать как раз была смена группы чтоб не гробить процессы в бекграунде по SIGTERM самому шеллу)
Записан
spectre71
Гость
« Ответ #2 : Июнь 25, 2009, 11:33 »

в линуксе есть такая штука как "группа", причем, если мне не изменяет память то сигнал рассылается всей группе => нужно слать сигнал родителю (если надо, могу откопать коды 2ого курса где нас учили работать с процессами, если помнится то в shell'е, к-ый нас заставляли писать как раз была смена группы чтоб не гробить процессы в бекграунде по SIGTERM самому шеллу)
С группами я пытался разобраться, но так и не понял как применить их к моей задаче, если знаешь помоги!
С другой стороны слать сигнал родителю точно безсмысленно, пример:
Родитель порождает Дочерний процесс и сразу завершается, а Дочерний процесс продолжает работать.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июнь 25, 2009, 11:41 »

а нельзя например родителю, когда он создаёт потомство - как то узнать PID этих потомков.. и потом если вдруг он завершается - то по этим PID - ам происходит kill  (например в деструкторе родителя) Непонимающий
не? или я опять костыль придумал? Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июнь 25, 2009, 11:50 »

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

а нельзя например родителю, когда он создаёт потомство - как то узнать PID этих потомков.. и потом если вдруг он завершается - то по этим PID - ам происходит kill  (например в деструкторе родителя) Непонимающий
не? или я опять костыль придумал? Улыбающийся
Смешно!
Родитель запущенный процесс - любая консольная программа! Какой может быть деструктор родителя
Записан
spectre71
Гость
« Ответ #6 : Июнь 25, 2009, 11:56 »

а родитель како-то левый или тобой написанный?
Любая консольная программа и для моего приложения - черный ящик!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Июнь 25, 2009, 12:13 »

гм, ну если известен процесс, то пид можно получить через ps. аналогично через нее же можно выцепить и все прцессы с ппидом, равным пиду родительского и пригробить их поштучно...
а группы немного не то, или я чего-то не понимаю)
Записан
spectre71
Гость
« Ответ #8 : Июнь 25, 2009, 12:28 »

гм, ну если известен процесс, то пид можно получить через ps. аналогично через нее же можно выцепить и все прцессы с ппидом, равным пиду родительского и пригробить их поштучно...
а группы немного не то, или я чего-то не понимаю)
В общем случае невозможно!
1) Неизвестены моменты запуска Дочерних процессов.
2) Пид родителя у Дочернего может сменниться, и ситуаций здесь много, пример:
Родитель в какой-то момент порождает Дочерний процесс и быстро завершается, а Дочерний процесс продолжает работать.
Даже если постоянно мониторить пиды(что очень накладно), можно промазать и пропустить момент - порождение Дочернего+изменение у него  пида родителя.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Июнь 25, 2009, 13:06 »

а если почитать про принцип формирования PID-ов в линуксе и уже исходя от этого плясать?

1. есть ли какая нить закономерность в PID-ах родителя и дочерних? т.е. можно как-то узнать по PID-у какго нить выборочного процесса, кто его родитель??
2. если так можно, то приложение при запуске своего процесса просто запоминает его PID... и если вдруг оно "прибивает" этот процесс, то
 с помошью ps можно найти все PID-ы дочерних и поддочерних и подподдочерних процессов (например по маске или как нить так - я хез, нужно читать про ps, kill и т.п.)  и прибить их все! Улыбающийся

Но это если все-таки есть какая-то связь м\у PID ами (я хез ) Улыбающийся

можно и так как говорит Авварон , например после прибития главного процесса - в течении определенного времени мониторить систему и прибивать дочерние процессы которые создают новые и новые!!! Улыбающийся например в течении 30 секунд и т.п. 

ЗЫ: и тут хто его знает кто победит - или живучие дочерние, которые постоянно рожают новых.. или твое приложение, которое их прибивает Улыбающийся
« Последнее редактирование: Июнь 25, 2009, 13:10 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
spectre71
Гость
« Ответ #10 : Июнь 25, 2009, 13:21 »

Я только-что писал:
В общем случае невозможно!
1) Неизвестены моменты запуска Дочерних процессов.
2) Пид родителя у Дочернего может сменниться, и ситуаций здесь много, пример:
Родитель в какой-то момент порождает Дочерний процесс и быстро завершается, а Дочерний процесс продолжает работать.
Даже если постоянно мониторить пиды(что очень накладно), можно промазать и пропустить момент - порождение Дочернего+изменение у него  пида родителя.

Если Пид родителя у Дочернего сменился его не найти!!!
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Июнь 25, 2009, 13:23 »

А как он сменится? о_О он же вроде всегда один и тот же..  процесс запустили, пид присвоился и все.... и с этим пидом он и буит "всю жизнь" пока не прихлопнут.. не?
« Последнее редактирование: Июнь 25, 2009, 13:25 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
spectre71
Гость
« Ответ #12 : Июнь 25, 2009, 13:29 »

А как он сменится? о_О он же вроде всегда один и тот же..  процесс запустили, пид присвоился и все.... и с этим пидом он и буит "всю жизнь" пока не прихлопнут.. не?
Ничего подобного.
По Linux если родительский процесс завершился тем или иным образом, все его дочерние перепривязываются к какому-то там системному процессу.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Июнь 25, 2009, 14:12 »

к иниту, процессу с номером 1...
Записан
spectre71
Гость
« Ответ #14 : Июнь 25, 2009, 14:30 »

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


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