Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Kill eines SH Skiptes und aller Childprozesse

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Augur
Newbie
Newbie
Beiträge: 20
Registriert: 13. Feb 2005, 18:14
Kontaktdaten:

Kill eines SH Skiptes und aller Childprozesse

Beitrag von Augur »

Hi.

Ich hab das Problem, dass ich mit einem Skript ein anderes abschiessen will. Leider bleiben die von dem Skript aufgerufenen Programme am laufen und hängen nun unter dem Root.

Wie kann ich einfach den gesamten Prozessbaum von dem zu killenden Skript beenden lassen?

Danke und Gruß,
Nils
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

Wird ein Prozess beendet, egal wie, dann sendet er an alle Prozesse die er generiert hat, also an alle Sohnprozesse, das Signal 1 (HUP) bedeutet "Hänge auf oder lege auf (wie beim Telefon)". Damit würde im Normalfall dieser Prozess auch beendet und würde seinerseits an alle seine Sohnprozesse das Signal 1 senden usw.

allerdings ist es so, dass Signale maskiert werden können, das heist, ich kann jedem Prozess sagen, Achtung wenn dieses oder jenes Signal kommt, dann beendet dich nicht, sondern ignoriere das Signal, oder mache diese Routine. Das geht mit fast jedem Signal auser 7 (KILL). Der Shellbefehl zum maskieren von Signalen ist trap, zum maskieren von signal HUP gibt es sogar einen eingenen Befehl, das Kommando nohup .
Diese Prozesse die auf diese Art und Weise ihren Vaterprozess verloren haben, erhalten als neuen Vaterprozess PID 1. Man nennt sie auch Zombis.

Wenn du solche Prozesse mit maskiertem Signal HUP hast, und die über ein Script anhalten willst, musst du die ID der Sohnprozesse im Script ermitteln und dann mit einem anderem Signal das für diesen Prozess nicht maskiert ist zB. 15 killen.

siehe zB man kill man nohup man trap man signal

robi
Augur
Newbie
Newbie
Beiträge: 20
Registriert: 13. Feb 2005, 18:14
Kontaktdaten:

Beitrag von Augur »

Hi.

Benutzte kein Trap, etc.

Einfach ein SH-Skript:

Code: Alles auswählen

#!/bin/sh
Programm 1
Programm 2
pstree -p Ausgabe:
skript.sh(123) -> Programm 1(456)

Wenn ich nun einen kill -(egal welches Signal) 123
absetze, wird nur das Skript beendet. Programm 1 läuft weiter.
Ist das normal??? Oder liegt das an Programm 1?

Gruß, Nils
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

Normal ist das nicht so ganz. Ich sehe im Moment nur 2 Möglichkeiten:
entweder im Programm1 ist das Signal 1 maskiert, das ist zum Beispiel bei vielen Daemon so, dort wird das Signal 1 dazu verwendet das der Daemon seine config neu ließt und sich neu startet.

oder aber der Prozess bekommt gar keine CPU-Zeit mehr zugewiesen, weil er zB seine CPU-Zeit an eine Kernelinterne Routine abgegeben hat und diese sich nicht zurückmeldet. Will heisen der Prozess hängt im Kernel fest, kenne ich beispielsweise aus dem Umfeld von IO-Error von Devices. Solche Prozess lassen sich dann auch mit kill -9 nicht beenden, erst ein Reset auf den IO-Kanal bringt den Prozess dazu, auf das schon längst abgegebene Signal zu reagieren.

Wenn das beides nicht so recht zutreffen sollte, dann gib mal bitte die Ausgabe von cat /proc/PID/status (PID vom Programm1) vor dem killen und nach dem killen des scriptes. Mal sehen ob ich was rauslesen kann.

robi
Augur
Newbie
Newbie
Beiträge: 20
Registriert: 13. Feb 2005, 18:14
Kontaktdaten:

Beitrag von Augur »

Danke schon mal für die Hilfe:

Code: Alles auswählen

Name:   esniper
State:  S (sleeping)
Tgid:   5286
Pid:    5286
PPid:   5283
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups:
VmSize:     3064 kB
VmLck:         0 kB
VmRSS:         4 kB
VmData:      172 kB
VmStk:        20 kB
VmExe:        48 kB
VmLib:      2680 kB
SigPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 0000000000001007
SigCgt: 0000000000006000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
nachher:

Code: Alles auswählen

Name:   esniper
State:  S (sleeping)
Tgid:   5286
Pid:    5286
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups:
VmSize:     3064 kB
VmLck:         0 kB
VmRSS:         4 kB
VmData:      172 kB
VmStk:        20 kB
VmExe:        48 kB
VmLib:      2680 kB
SigPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 0000000000001007
SigCgt: 0000000000006000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
[quote][/quote]
Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3174
Registriert: 25. Aug 2004, 02:13

Beitrag von robi »

SigIgn: 0000000000001007
SigCgt: 0000000000006000

SigIgn : hier sind die Signale die vom Prozess ignoriert werden.
In deinem Fall 1; 2; 3; 13
SigCgt: Hier die Signale auf die für den Prozess spezielle Routinen bei Signaleingang definiert wurden. in deinem Fall 14; 15
Eventuell sind es die Signale die den Prozess dazu bewegen vor der Beendigung noch bestimmte Routinen zu durchlaufen, damit der Prozess und eventuelle von ihm gestartete Prozesse und Pipe sauber beendet wird. (kenne das Programm nicht)

Demnach sollte Dein Prozess nicht mit SIGHUB SIGINT SIGQUIT SIGPIPE SIGALARM SIGTERM weder vor noch nach dem Beenden des Vaterprozesses zu killen sein, und sich desshalb auch nicht beim beenden des Vaterprozesses automatisch beenden.

Ich würde empfehlen im Notfall den Prozess mittels script mit Signal SIGUSR1 (10) zu killen. Ansonsten testen ob sich der Prozess von der Shell gestartet mit Signal 15 (Strg C) beenden lässt, und wenn ja dann mit kill -15 im Script ein sauberes Beenden des Prozesses zu erwirken.

robi
Augur
Newbie
Newbie
Beiträge: 20
Registriert: 13. Feb 2005, 18:14
Kontaktdaten:

Beitrag von Augur »

Also nichts mit Script beenden und der Prozess beendet sich auch?
Naja, hab mir auch schon einen Workaround mit regex gebastelt, der wird ann wohl Standard.

Danke dir.
Antworten