Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: kei.101 25. 07. 2013, 13:49:25

Název: Zabití potomků shell skriptu
Přispěvatel: kei.101 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.
Název: Re:Zabití potomků shell skriptu
Přispěvatel: jsf 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).
Název: Re:Zabití potomků shell skriptu
Přispěvatel: gg 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.
Název: Re:Zabití potomků shell skriptu
Přispěvatel: Ondřej Caletka 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í.