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
Unterprozess killen
Re: Unterprozess killen
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
im anderen Skript kannst du den Inhalt von /tmp/meineProzessID ja wieder auslesen und in einer Variablen speichern oder gleich irgendetwas anderes damit machen
aber vielleicht könntest du ja auch alles in ein Skript packen, ganz grob etwa so, wenn das bei deinem Anwendungsfall irgendeinen Sinn ergibt
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
Code: Alles auswählen
kill $(cat /tmp/meineProzessID)
Code: Alles auswählen
sleep 20s &
PROZESSID=$!
if test …; then
kill ${PROZESSID}
else
wait ${PROZESSID}
fi
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Unterprozess killen
Hey smutbert! Immer schön das Copyright beachten! Der Befehl wurde von D&A erfundensleep 20s &
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
Code: Alles auswählen
function machwas {
echo katze fuettern
}
while :; do
trap machwas SIGUSR1
sleep 1800
trap "" SIGUSR1
machwas
done
Deinem Hauptprozess kannst Du mit
Code: Alles auswählen
kill -SIGUSR1 <hauptscript-pid>
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.