[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: kill 'em all до седьмого колена



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

Ю.

Reply to: