Zabití potomků shell skriptu

kei.101

Zabití potomků shell skriptu
« kdy: 25. 07. 2013, 13:49:25 »
Ahoj.

Mám skript, který spouští jiné procesy na pozadí. Při ukončení původního skriptu bych potřeboval, aby se ukončil celý podstrom procesů, které daný skript spustil.

Používám ve skriptu toto:
Kód: [Vybrat]
trap 'pkill -P $$' INT TERM

Zajímavé ale je, že to někdy funguje a někdy zase ne (spouštím pořád stejné programy!)

Nevíte někdo, jak to udělat spolehlivě?

Díky.
« Poslední změna: 25. 07. 2013, 13:51:17 od Petr Krčmář »


jsf

Re:Zabití potomků shell skriptu
« Odpověď #1 kdy: 25. 07. 2013, 14:04:07 »
Tipuju ze proto, ze odchytavas trap-em jenom SIGINT a SIGTERM, a pravdepodobne nastava nejaka udalost, kterou podchycenou nemas (treba skript skonci normalne exit-em).

gg

Re:Zabití potomků shell skriptu
« Odpověď #2 kdy: 25. 07. 2013, 14:22:02 »
Toto je moje verze spolehliveho killovatka:

Kód: [Vybrat]
mypgrep () {
  [ ${#1} -le 1 ] && return
  for pid in `pgrep -P "${1}"`;
  do
     mypgrep ${pid}
  done
  echo ${1}
}

mykill () {
  for pid in `mypgrep ${1}`;
  do
    kill -KILL ${pid}
  done
}

mykill $$

Zkuste, treba vam to pomuze.

Re:Zabití potomků shell skriptu
« Odpověď #3 kdy: 25. 07. 2013, 14:25:30 »
S tímhle jsem se taky trápil a na řešení moc nepřišel. Jediné, co jsem někde vygooglil bylo použít
Kód: [Vybrat]
kill -TERM -<control group>kde <control group> je shodné s PID rodičovského procesu. Ale některé verze killu mi záporné číslo procesu úplně odmítají.