Unterprozess killen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fiberkill
Beiträge: 221
Registriert: 28.03.2007 09:08:30

Unterprozess killen

Beitrag von fiberkill » 13.01.2016 13:40:19

Hallo zusammen,

ich habe mir ein Skript geschrieben, dass eigentlich nur einen sleep Befehl und ein paar andere Dinge enthält.
Wenn ich das Skript starte bekommt es ja eine PID. Der sleep Befehl ist dann ja nur ein Unterprozess.
Ich möchte mit einem weitern Skript, welches automatisch aus dem Hauptskript generiert wird, gezielt diesen sleep befehl killen ohne das Hauptskript azuschießen.

wie kann ich ohne (ohne ps, grep usw.) großen Aufwand die PID des sleep Befehls ermitteln?

Gruß
FK

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Unterprozess killen

Beitrag von smutbert » 13.01.2016 14:45:40

pgrep gäbe es auch noch… ;)

Die PID eines im Hintergrund gestarteten Prozesses steht in der Variablen $!, deren Inhalt du irgendwo zwischenspeichern kannst. (Das gilt auch für einen nicht im Hintergrund gestarteten Prozess, aber bei dem kannst du die Variable erst auslesen nachdem sich der Prozess beendet hat oder du ihn in den Hintergrund verfrachtet hast…)
Wenn sleep eigentlich im Vordergrund laufen soll, kannst du ihn ja direkt wieder in den Vordergrund holen

Code: Alles auswählen

sleep 20s &
echo $! > /tmp/meineProzessID
fg
im anderen Skript kannst du den Inhalt von /tmp/meineProzessID ja wieder auslesen und in einer Variablen speichern oder gleich irgendetwas anderes damit machen

Code: Alles auswählen

kill $(cat /tmp/meineProzessID)
aber vielleicht könntest du ja auch alles in ein Skript packen, ganz grob etwa so, wenn das bei deinem Anwendungsfall irgendeinen Sinn ergibt

Code: Alles auswählen

sleep 20s &
PROZESSID=$!

if test …; then
    kill ${PROZESSID}
else
    wait ${PROZESSID}
fi

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Unterprozess killen

Beitrag von heisenberg » 13.01.2016 20:10:16

sleep 20s &
Hey smutbert! Immer schön das Copyright beachten! Der Befehl wurde von D&A erfunden :)

Der Vorschlag von smutbert ist in jedem Fall eine simple Variante.

----

Eine Alternative wäre trap:

kill ist ja nicht nur zum abschiessen sondern eher Allgemein zum kommunizieren gedacht - auch wenn das harte KILL-Signal(Signal Nummer 9) jetzt eine eher einseitige Art der Kommunikation ist - wie im richtigen Leben halt auch manchmal. Du kannst dem Script also ein Signal schicken und das Script kann darauf reagieren(außer bei 9/KILL).

Nehmen wir an, dass Dein Script ungefähr so aussieht:

Code: Alles auswählen

function machwas {
     echo katze fuettern
}
while :; do
    sleep 1800
    machwas 
done
...dann könnte man durch ein Signal auch vorzeitig machwas ausführen lassen:

Code: Alles auswählen

function machwas {
     echo katze fuettern
}

while :; do
    trap machwas SIGUSR1
    sleep 1800
    trap "" SIGUSR1
    machwas 
done
D. h. jeweils vor der Ausführung von sleep wird ein Signalhandler gesetzt, der den sleep Befehl unterbricht und nach Abarbeitung der Funktion wieder zum sleep zurückkehrt.

Deinem Hauptprozess kannst Du mit

Code: Alles auswählen

kill -SIGUSR1 <hauptscript-pid>
so ein Signal schicken.

Damit der Signalhandler nicht mitten in der Ausführung von machwas zuschlägt, wird der Signalhandler nur für die Zeit des Sleeps aktiviert und ansonsten ignoriert.

Eines der Probleme an dem Script ist, dass die Katze definitiv zu fett wird, wenn man sie alle halbe Stunde füttert.

Antworten