On Fri, 22 May 2009, Alex Kicelew wrote:
yuri.nefedov@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
UID PID PPID C STIME TTY STAT TIME CMD nefedov 3927 3916 0 09:44 pts/1 Ss+ 0:00 bash nefedov 16717 3916 0 10:08 pts/3 Ss+ 0:00 bash nefedov 30627 16717 0 12:10 pts/3 S 0:01 nedit nefedov 30648 3916 0 12:11 pts/4 Ss 0:00 bash nefedov 30700 30648 0 12:11 pts/4 S+ 0:00 /bin/sh /home/nefedov/bin/les nefedov 30701 30700 0 12:11 pts/4 Sl+ 0:00 vim --cmd let no_plugin_maps Ну и прибить потом ./list_ppid $ppid | xargs kill -9 Ю.