On Fri, 22 May 2009, Alex Kicelew wrote:
yuri.nefe...@gmail.com -> debian-russian@lists.debian.org @ Fri, 22 May 2009
13:04:12 +0400 (MSD):
Глупый вопрос. А можно ли как-то убить pid вместе со всеми детьми, но
без родителей? pgrp/pgid включают и родителей, что не подходит.
Пардон, что-то вчера вечером голова не работала..
Вообще-то имеется pgrep (pkill). А там опции -P ppid, -g pgrp, -G gid
Видимо в ту сторону и надо копать.
Тоже не получилось. Придется, похоже, лазить по дереву потомков...
Есть программа А. Она запускает из себя программу Б. Запускает так, что
Б попадает в ту же pgrp, что и А (и в те же egid и т.п.). Программа Б
тоже плодит из себя потомков, причем через шелл, так что ее
непосредственным дитем является шелл, а уже он -- родитель всех
остальных кошмаров. Эту программу Б нужно время от времени убивать
вместе со всеми, ею порожденными, но программа А должна продолжать
работать...
Если рекурсия в bash не смущает, то можно сделать
довольно короткий скрипт:
---
#!/bin/bash
list_pid_children()
{
pid="$1"
local PLIST=`pgrep -d " " -P $pid`
if [[ ! -z "${PLIST}" ]]; then
for p in ${PLIST}; do
list_pid_children ${p}
done
echo -n "$PLIST "
fi
}
list_pid_children $1
echo
exit
---
Проверить можно например так:
./list_ppid 3916 | xargs ps -f
UIDPID PPID C STIME TTY STAT TIME CMD
nefedov 3927 3916 0 09:44 pts/1Ss+0:00 bash
nefedov 16717 3916 0 10:08 pts/3Ss+0:00 bash
nefedov 30627 16717 0 12:10 pts/3S 0:01 nedit
nefedov 30648 3916 0 12:11 pts/4Ss 0:00 bash
nefedov 30700 30648 0 12:11 pts/4S+ 0:00 /bin/sh /home/nefedov/bin/les
nefedov 30701 30700 0 12:11 pts/4Sl+0:00 vim --cmd let no_plugin_maps
Ну и прибить потом ./list_ppid $ppid | xargs kill -9
Ю.