Erweiterte Optionen zur Prozessbeendigung
In diesem Schritt untersuchen wir einige erweiterte Optionen des pkill-Befehls, die eine anspruchsvollere Prozessverwaltung ermöglichen.
Verwendung verschiedener Signal-Typen
Standardmäßig sendet pkill das Signal SIGTERM (Signal 15) an Prozesse. Dieses Signal ermöglicht es Prozessen, sich ordnungsgemäß zu beenden, Dateien zu schließen und Aufräumarbeiten durchzuführen. Es gibt jedoch Fälle, in denen Sie ein anderes Signal verwenden möchten.
Erstellen wir ein Skript, das Signale verarbeitet:
cd ~/project
nano signal_handler.sh
Fügen Sie den folgenden Inhalt in das Skript ein:
#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM
echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
sleep 1
done
Machen Sie das Skript ausführbar:
chmod +x ~/project/signal_handler.sh
Führen Sie das Skript im Hintergrund aus:
~/project/signal_handler.sh &
Nun versuchen wir, verschiedene Signale an den Prozess zu senden:
- Senden Sie ein SIGHUP-Signal (Signal 1):
pkill -HUP -f signal_handler.sh
- Starten Sie das Skript erneut und senden Sie SIGINT (Signal 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- Starten Sie das Skript erneut und senden Sie das Standard-SIGTERM (Signal 15):
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM
Für jedes Signal sollten Sie die entsprechende Meldung in der Terminalausgabe sehen, bevor der Prozess beendet wird.
Beenden von Prozessen nach Alter
pkill ermöglicht es Ihnen, Prozesse basierend auf ihrem Alter über die Option --newest anzusprechen, welche die zuletzt gestarteten Prozesse auswählt.
Erstellen wir einige Prozesse mit unterschiedlichen Startzeiten:
cd ~/project
nano age_test.sh
Fügen Sie den folgenden Inhalt in das Skript ein:
#!/bin/bash
while true; do
echo "Process running with PID $$"
sleep 5
done
Machen Sie das Skript ausführbar:
chmod +x ~/project/age_test.sh
Starten Sie den ersten Prozess:
~/project/age_test.sh &
Warten Sie einige Sekunden und starten Sie dann zwei weitere Prozesse:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Nun beenden wir nur die beiden zuletzt gestarteten Prozesse mit der Option --newest:
pkill -f --newest 2 age_test.sh
Überprüfen Sie, welche Prozesse noch laufen:
ps aux | grep age_test.sh
Sie sollten sehen, dass nur der erste Prozess noch läuft, da er vor den anderen beiden Prozessen gestartet wurde.
Beenden Sie den verbleibenden Prozess:
pkill -f age_test.sh
Einschränkung von pkill nach Prozessbesitzer
Sie können die Aktionen von pkill auch auf Prozesse beschränken, die einem bestimmten Benutzer gehören. In einem Multi-User-System ist dies besonders nützlich.
Zur Demonstration führen wir einige Prozesse als der aktuelle Benutzer aus:
~/project/rogue_app.sh &
~/project/rogue_app.sh &
Nun beenden wir diese Prozesse, aber nur diejenigen, die Ihrem aktuellen Benutzer gehören:
pkill -f -u $(whoami) rogue_app.sh
Die Option -u gibt den Benutzernamen des Prozesseigentümers an. Die Befehlssubstitution $(whoami) ruft Ihren aktuellen Benutzernamen ab.
Überprüfen Sie, ob alle Prozesse beendet wurden:
ps aux | grep rogue_app.sh
Sie sollten nur den grep-Befehl selbst in der Ausgabe sehen.
Diese Möglichkeit, Prozesse nach Besitzer gezielt anzusprechen, ist besonders in Multi-User-Umgebungen nützlich, in denen Sie vermeiden möchten, Prozesse anderer Benutzer zu beeinflussen.