URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 77819
[ Назад ]

Исходное сообщение
"как убить все дочерние процессы"

Отправлено AITech , 10-Дек-07 21:27 
Запускаем скрипт, скрипт пускает чтонить, например игрушку.
Как убить порожденные процессы? Все дерево процессов.

В принципе "один слой" можно убить так:
pkill -P пид_скрипта
Но что если есть "второй слой", третий? Как замочить их всех?

И есть ли какой нибудь системный вызов для этого? Что то типа
bool killthemall(int pid);
=))))


Содержание

Сообщения в этом обсуждении
"как убить все дочерние процессы"
Отправлено angra , 10-Дек-07 22:22 
>И есть ли какой нибудь системный вызов для этого? Что то типа

А зачем? У вас какие-то странные желания. Если все процессы вменяемые, то посылка TERM(но не KILL) родителському должна привести к схлопыванию всего дерева. Если же по каким-либо причинам корректного завершения по TERM не происходит, то после убийства корневого через KILL все остальные останутся зомбями и init их сам придушит, а если не придушит, то просто грепаем по Zz вывод ps и отдаем KILL всем зомбям. Альтернативно можно конечно написать простенький скрипт, который будет проходить по дереву процессов начиная от какого-то PID и посылать KILL всем потомкам.



"как убить все дочерние процессы"
Отправлено AITech , 10-Дек-07 23:02 
>>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>А зачем? У вас какие-то странные желания. Если все процессы вменяемые, то
>посылка TERM(но не KILL) родителському должна привести к схлопыванию всего дерева.
>Если же по каким-либо причинам корректного завершения по TERM не происходит,
>то после убийства корневого через KILL все остальные останутся зомбями и
>init их сам придушит, а если не придушит, то просто грепаем
>по Zz вывод ps и отдаем KILL всем зомбям. Альтернативно можно
>конечно написать простенький скрипт, который будет проходить по дереву процессов начиная
>от какого-то PID и посылать KILL всем потомкам.

Должна но не приводит =)
Например в скрипте прописываем запуск популярной игрушки
/usr/games/wormux
запускаем, видим в процессах
PID - PPID - NAME
555 - xxx - bash
556 - 555 - wormux

убиваем kill -s TERM 555, wormux не реагирует, можно играть дальше.

З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить одну запущенную игру, при запуске другой.


"как убить все дочерние процессы"
Отправлено angra , 11-Дек-07 04:56 
>Должна но не приводит =)

Я же сказал при условии вменяемости процессов :)

>З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить
>одну запущенную игру, при запуске другой.

напишите простой bash или perl скрипт, который убивает всю ветку. Для поиска всех pid может оказаться полезной pstree. Например
$pstree -p 3654
firefox-bin(3654)-+-{firefox-bin}(3665)
                  |-{firefox-bin}(3666)
                  |-{firefox-bin}(3684)
                  |-{firefox-bin}(3685)
                  |-{firefox-bin}(3747)
                  |-{firefox-bin}(3756)
                  `-{firefox-bin}(3769)
$ pstree -p 3654| perl -ne 'print "$1\n" foreach /\((\d+)\)/g;'
3665
3665
3666
3684
3685
3747
3756
3769
Заменяем print на `kill -9 $1` и все умрет :)


"как убить все дочерние процессы"
Отправлено AITech , 11-Дек-07 22:20 
>[оверквотинг удален]
>$ pstree -p 3654| perl -ne 'print "$1\n" foreach /\((\d+)\)/g;'
>3665
>3665
>3666
>3684
>3685
>3747
>3756
>3769
>Заменяем print на `kill -9 $1` и все умрет :)

СПАСИБО!


"как убить все дочерние процессы"
Отправлено angra , 12-Дек-07 05:52 
звиняюсь сделал глупейшую ошибку. Надо
perl -ne 'print "$1\n" while /\((\d+)\)/g;'
или
perl -ne 'print "$_\n" foreach /\((\d+)\)/g;'
то есть либо $1+while либо $_+foreach, но не $1+foreach иначе будет ерунда когда несколько процессов в одной строке вывода pstree.

"как убить все дочерние процессы"
Отправлено ipmanyak , 11-Дек-07 22:46 
>[оверквотинг удален]
>Как убить порожденные процессы? Все дерево процессов.
>
>В принципе "один слой" можно убить так:
>pkill -P пид_скрипта
>Но что если есть "второй слой", третий? Как замочить их всех?
>
>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>bool killthemall(int pid);
>=))))

killall  имя_родителя_процесса
не подойдет ?


"как убить все дочерние процессы"
Отправлено Keeper , 12-Дек-07 09:56 
Программку htop ещё можно попробовать.