ubuntuusers.de

zwei PID für eine Script

Status: Ungelöst | Ubuntu-Version: Kubuntu 16.04 (Xenial Xerus)
Antworten |

Serengeti

Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1961

Hallo zusammen.

Mir ist aufgefallen, dass wenn ich ein Script starte es heufig mit zwei PIDs im System zufinden ist. pgrep -f scrip.sh gibt mir dann die PID und eine weiter PID welche um +1 grösser ist aus.

woran kann das liegen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Serengeti schrieb:

Mir ist aufgefallen, dass wenn ich ein Script starte es heufig mit zwei PIDs im System zufinden ist. pgrep -f scrip.sh gibt mir dann die PID und eine weiter PID welche um +1 grösser ist aus.

woran kann das liegen?

An dem Skript. Ernsthaft, das kann man so allgemein nicht sagen.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Ein bisschen schon. Subshells, Pipes und dergleichen verursachen zusätzliche Prozesse – an denen gibt es ja fast keinen Weg vorbei:

1
2
3
4
5
6
#!/bin/bash

while sleep 1
do
    date
done | cat

Prozessteilbaum:

hallo.sh(20107)─┬─cat(20109)
                └─hallo.sh(20108)───sleep(20212)

In 20107 läuft „das Hauptskript“ und in 20108 „die while-Schleife“.

(Das ist dann auch mit ein Grund dafür, weshalb du in solchen Schleifen keine Variablen setzen kannst, die nach der Schleife noch verfügbar sind – sie waren nie im Hauptprozess.)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Vain schrieb:

Ein bisschen schon. Subshells, Pipes und dergleichen verursachen zusätzliche Prozesse – an denen gibt es ja fast keinen Weg vorbei:

Natürlich. Ich hatte das als so trivial angesehen, dass es nicht der Erwähnung wert ist. 😬 Aber vielleicht doch gut, dass Du es ausdrücklich nennst. 👍

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1961

ah. vielen Dank. Ich habe mich immer gewundert, weshalb

1
kill PID

nicht funktioniert um ein Script zu stoppen. Ich hatte mal gedacht, dass Kindprozesse immer von den Elternprozessen abhängig sind. Wie töte ich den ganzen Stambaum den ein Script so anlegt? Es kann problematisch sein, wenn die Kindprozesse überleben und einfach weitermachen.

Laut man kill muss ich einfach ein minus vor die PID stellen um ein die Gruppe zu killen aber das gibt bei mir nur Fehler aus.

1
Negative PID values may be used to choose whole process groups
1
2
kill -3275
bash: kill: 3275: Ungültige Signalbezeichnung.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Serengeti schrieb:

ah. vielen Dank. Ich habe mich immer gewundert, weshalb

1
kill PID

nicht funktioniert um ein Script zu stoppen. Ich hatte mal gedacht, dass Kindprozesse immer von den Elternprozessen abhängig sind. Wie töte ich den ganzen Stambaum den ein Script so anlegt? Es kann problematisch sein, wenn die Kindprozesse überleben und einfach weitermachen.

Du kannst es mit pkill über die Process Group oder die Session machen. Siehe auch 🇬🇧 hier. Das sauberste ist aber eigentlich, wenn das Skript selbst seine Kinder tötet.

Laut man kill muss ich einfach ein minus vor die PID stellen um ein die Gruppe zu killen aber das gibt bei mir nur Fehler aus.

1
Negative PID values may be used to choose whole process groups

kill ist ein interner Befehl der bash und die Version unterstützt diese Funktionalität nicht, soweit ich das sehe. Du müsstest dann explizit mit /bin/kill aufrufen.

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1961

rklm schrieb:

Das sauberste ist aber eigentlich, wenn das Skript selbst seine Kinder tötet.

Wäre es aufwändig so etwas um zu setzen?

Ansonsten wäre das hier laut dem Link mein gesuchter Befehl.

1
pkill -9 -s PID

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Serengeti schrieb:

rklm schrieb:

Das sauberste ist aber eigentlich, wenn das Skript selbst seine Kinder tötet.

Wäre es aufwändig so etwas um zu setzen?

Das hängt davon ab, wie das Skript aussieht. Generell kannst Du mit trap fast alle Signale abfangen und entsprechend reagieren.

Ansonsten wäre das hier laut dem Link mein gesuchter Befehl.

1
pkill -9 -s PID

Ich würde nicht SIGKILL verwenden, jedenfalls nicht im ersten Versuch. Das nimmt den Prozessen die Möglichkeit aufzuräumen.

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1961

Wenn ich das richtig verstanden habe, dann ist der alternative Befehl indem falle SIGTERM und somit:

1
2
3
pkill -SIGTERM -s PID
oder
pkill -15 -s PID

Von trap habe ich noch nie gehört und finde dazu auch nichts in man. Ich glaub aber ich bleibe lieber bei SIGTERM.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Serengeti schrieb:

Von trap habe ich noch nie gehört und finde dazu auch nichts in man. Ich glaub aber ich bleibe lieber bei SIGTERM.

Was der Bauer nicht kennt... Auf die Weise lernst Du nix.

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1961

Hat weniger damit zu tun als damit, dass das Aufwand/Nutzen Verhältnis in meinem Empfinden wesentlich zu stark Richtung Aufwand tendiert und ich das nicht mit Freude und Neugier kompensieren kann.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

Serengeti schrieb:

Von trap habe ich noch nie gehört und finde dazu auch nichts in man.

Falls es dich noch interessiert:

Antworten |