Erweiterte Optionen zur Prozessbeendigung
In diesem Schritt werden wir einige erweiterte Optionen des pkill
-Befehls untersuchen, die eine ausgefeiltere Prozessverwaltung ermöglichen.
Verwendung unterschiedlicher Signaltypen
Standardmäßig sendet pkill
das SIGTERM-Signal (Signal 15) an Prozesse. Dieses Signal ermöglicht es Prozessen, sich gracefully (sauber) zu beenden, Dateien zu schließen und Aufräumoperationen 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 dem Skript den folgenden Inhalt hinzu:
#!/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 &
Versuchen wir nun, 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 Nachricht in der Terminalausgabe sehen, bevor der Prozess beendet wird.
Beenden von Prozessen anhand ihres Alters
pkill
ermöglicht es Ihnen, Prozesse anhand ihres Alters mithilfe der Optionen --newer
und --older
anzusteuern.
Erstellen wir einige Prozesse mit unterschiedlichen Startzeiten:
cd ~/project
nano age_test.sh
Fügen Sie dem Skript den folgenden Inhalt hinzu:
#!/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 und erstellen Sie eine Referenzdatei:
~/project/age_test.sh &
touch ~/project/reference_time
Warten Sie einige Sekunden und starten Sie dann zwei weitere Prozesse:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Beenden wir nun nur die Prozesse, die nach der Erstellung der Referenzdatei gestartet wurden:
pkill -f --newer ~/project/reference_time age_test.sh
Überprüfen Sie, welche Prozesse noch laufen:
ps aux | grep age_test.sh
Sie sollten nur den ersten Prozess noch sehen, da er vor der Erstellung der Referenzdatei gestartet wurde.
Beenden Sie den verbleibenden Prozess:
pkill -f age_test.sh
Begrenzung von pkill auf Prozessbesitzer
Sie können auch die Aktionen von pkill
auf Prozesse beschränken, die von einem bestimmten Benutzer besessen werden. In einem Mehrbenutzersystem ist dies besonders nützlich.
Zur Demonstration lassen wir einige Prozesse als aktueller Benutzer laufen:
~/project/rogue_app.sh &
~/project/rogue_app.sh &
Beenden wir nun diese Prozesse, aber nur die, die von Ihrem aktuellen Benutzer besessen werden:
pkill -f -u $(whoami) rogue_app.sh
Die Option -u
gibt den Benutzernamen des Prozessbesitzers an. Der Befehlssubstitutionsausdruck $(whoami)
gibt Ihren aktuellen Benutzernamen zurück.
Ü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 anhand des Besitzers anzusteuern, ist besonders nützlich in Mehrbenutzerumgebungen, in denen Sie vermeiden möchten, dass Prozesse anderer Benutzer beeinträchtigt werden.