Запускаем скрипт, скрипт пускает чтонить, например игрушку.
Как убить порожденные процессы? Все дерево процессов.В принципе "один слой" можно убить так:
pkill -P пид_скрипта
Но что если есть "второй слой", третий? Как замочить их всех?И есть ли какой нибудь системный вызов для этого? Что то типа
bool killthemall(int pid);
=))))
>И есть ли какой нибудь системный вызов для этого? Что то типаА зачем? У вас какие-то странные желания. Если все процессы вменяемые, то посылка TERM(но не KILL) родителському должна привести к схлопыванию всего дерева. Если же по каким-либо причинам корректного завершения по TERM не происходит, то после убийства корневого через KILL все остальные останутся зомбями и init их сам придушит, а если не придушит, то просто грепаем по Zz вывод ps и отдаем KILL всем зомбям. Альтернативно можно конечно написать простенький скрипт, который будет проходить по дереву процессов начиная от какого-то PID и посылать KILL всем потомкам.
>>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>А зачем? У вас какие-то странные желания. Если все процессы вменяемые, то
>посылка 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 не реагирует, можно играть дальше.
З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить одну запущенную игру, при запуске другой.
>Должна но не приводит =)Я же сказал при условии вменяемости процессов :)
>З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить
>одну запущенную игру, при запуске другой.напишите простой 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` и все умрет :)
>[оверквотинг удален]
>$ pstree -p 3654| perl -ne 'print "$1\n" foreach /\((\d+)\)/g;'
>3665
>3665
>3666
>3684
>3685
>3747
>3756
>3769
>Заменяем print на `kill -9 $1` и все умрет :)СПАСИБО!
звиняюсь сделал глупейшую ошибку. Надо
perl -ne 'print "$1\n" while /\((\d+)\)/g;'
или
perl -ne 'print "$_\n" foreach /\((\d+)\)/g;'
то есть либо $1+while либо $_+foreach, но не $1+foreach иначе будет ерунда когда несколько процессов в одной строке вывода pstree.
>[оверквотинг удален]
>Как убить порожденные процессы? Все дерево процессов.
>
>В принципе "один слой" можно убить так:
>pkill -P пид_скрипта
>Но что если есть "второй слой", третий? Как замочить их всех?
>
>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>bool killthemall(int pid);
>=))))killall имя_родителя_процесса
не подойдет ?
Программку htop ещё можно попробовать.