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

2009-05-24 Пенетрантность Dmitry Fedorov
22 мая 2009 г. 17:29 пользователь Alex Kicelewнаписал:
>
> остальных кошмаров. Эту программу Б нужно время от времени убивать
> вместе со всеми, ею порожденными, но программа А должна продолжать
> работать...

Unix - стройная система костылей и подпорок.


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

2009-05-22 Пенетрантность yuri . nefedov

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

Ю.

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

2009-05-22 Пенетрантность yuri . nefedov

On Fri, 22 May 2009, Alex Kicelew wrote:


yuri.nefe...@gmail.com -> debian-russian@lists.debian.org  @ Fri, 22 May 2009 
01:23:56 +0400 (MSD):


Глупый вопрос. А можно ли как-то убить pid вместе со всеми детьми, но
без родителей? pgrp/pgid включают и родителей, что не подходит.

  Hапример так:
  ps -ef | awk '$3 == '$ppid' { print $2 }' | xargs --replace kill -9 {}
  Ну а если и "внуков" и до 7-е колена, то скрипт писать надо.


Мнда. Засада подкралась из-за угла...


 p.s. А что такое pgrp/pgid, если не секрет?


Это для группового убийства. Ид группы подсовывается киллу со знаком
минус.



  Пардон, что-то вчера вечером голова не работала..
  Вообще-то имеется pgrep (pkill). А там опции -P ppid, -g pgrp, -G gid
  Видимо в ту сторону и надо копать.

 Ю.

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

2009-05-21 Пенетрантность yuri . nefedov

On Thu, 21 May 2009, Alex Kicelew wrote:


Hi

Глупый вопрос. А можно ли как-то убить pid вместе со всеми детьми, но
без родителей? pgrp/pgid включают и родителей, что не подходит.



  Hапример так:
  ps -ef | awk '$3 == '$ppid' { print $2 }' | xargs --replace kill -9 {}

  Ну а если и "внуков" и до 7-е колена, то скрипт писать надо.

 Ю.

 p.s. А что такое pgrp/pgid, если не секрет?