Portál AbcLinuxu, 11. května 2025 09:58

Dotaz: Neinteraktivni shell neukonci potomky kdyz skonci na signal

mutable avatar 9.9.2009 22:23 mutable | skóre: 7 | blog: mutable_the_mutative
Neinteraktivni shell neukonci potomky kdyz skonci na signal
Přečteno: 263×
Odpovědět | Admin

Ahoj.

Když pustím:

sh -c 'yes'

a pošlu SIGTERM právě spuštěnému shellu, sh i yes skončí.

Když pustím:

sh -c 'yes | sed "s/y/n/"'

a pošlu SIGTERM právě spuštěnému shellu, sh skončí, ale yes a sed zůstanou běžet (init se stane předkem).

 

Proč?

 

V bash manpage je napsáno, že pokud je shell interaktivní a dostane SIGHUP, přepošle ho všem potomkům a počká na ně než se ukončí. Je možné dosáhnout něčeho podobného (tj. ukončit processy, které pod ním běží, když dostane nějaký signál, např. TERM) když je shell neinteraktivní (tj. když ho spustím s parametrem -c).

Děkuju za pomoc.

 

Lizzie Nexuiz Server
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

9.9.2009 22:45 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Neinteraktivni shell neukonci potomky kdyz skonci na signal
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proč?
Neručím za to, že to vysvětluji správně - větší znalci mě snad opraví :-).

Pokud pustím z terminálu
sh -c 'yes'
tak sh provede rovnou exec() a yes je tedy potomkem interaktivního shelu a tudíž dostane hezky ten signál přeposlaný.

Pokud se ale spustí
sh -c 'yes | sed "s/y/n/"'
tak se musí vytvořit subshell (jsou nutné 2× fork() a 2× exec()) a ten už je neinteraktivní a signály asi ignoruje.

Jak se tomu vyhnout mě ale nenapadá.
I am always ready to learn although I do not always like to be taught. (W. Churchill)
mutable avatar 9.9.2009 22:56 mutable | skóre: 7 | blog: mutable_the_mutative
Rozbalit Rozbalit vše Re: Neinteraktivni shell neukonci potomky kdyz skonci na signal

Diky, to je ono (v prvnim pripade v `ps -f' opravdu zadny sh neni, v druhem ano).

Ten neinteraktivni shell signaly neignoruje, ale jenom nepokilluje potomky (coz je asi spravne, ale ted mi to zrovna nevyhovuje).

10.9.2009 10:49 ams
Rozbalit Rozbalit vše Re: Neinteraktivni shell neukonci potomky kdyz skonci na signal

Muzete poslat signal cele skupine procesu, to zabije nejenom sh -c ale i jeho potomky. To se dela tak, ze prikazu kill predate zaporny PID. Napr., pokud PID procesu sh -c je 1234, pak kill -9 -1234 zabije i 'yes | sed'.

10.9.2009 16:13 pakanek | skóre: 28 | Vyškov
Rozbalit Rozbalit vše Re: Neinteraktivni shell neukonci potomky kdyz skonci na signal
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud by to bylo ve skriptu a chtěl by jsi si po sobě uklidit, tak ještě můžeš použít trap, kterým definuješ akce, které se mají provést po obdržení specifického signálu.
Všechno dobré je pro něco zlé.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.