Ich starte eine Reihe von Bildschirmen in einem Bash-Skript und führe dann in jedem von ihnen den Befehl runserver
von Django aus. Ich möchte auch in der Lage sein, sie alle programmgesteuert zu stoppen. Dazu muss ich Control+c
an runserver
senden.
Wie kann ich diese Tastatureingaben aus meinem Bash-Skript senden?
Ctrl+C sendet ein SIGINT
Signal.
kill -INT <pid>
sendet auch ein SIGINT
Signal:
# Terminates the program (like Ctrl+C)
kill -INT 888
# Force kill
kill -9 888
Angenommen, 888
ist Ihre Prozess-ID.
Beachten Sie, dass kill 888
ein SIGTERM
-Signal sendet, das sich geringfügig unterscheidet, aber auch das Programm zum Stoppen auffordert. Wenn Sie also wissen, was Sie tun (kein Handler im Programm an SIGINT
gebunden), reicht ein einfacher kill
aus.
Verwenden Sie $!
, um die PID des letzten in Ihrem Skript gestarteten Befehls abzurufen:
# Launch script in background
./my_script.sh &
# Get its PID
PID=$!
# Wait for 2 seconds
sleep 2
# Kill it
kill $PID
CTRL-C sendet im Allgemeinen ein SIGINT-Signal an den Prozess, sodass Sie einfach Folgendes tun können:
kill -INT <processID>
von der Befehlszeile (oder einem Skript) aus, um den spezifischen processID
zu beeinflussen.
Ich sage "allgemein", weil dies, wie bei den meisten UNIX-Systemen, nahezu unendlich konfigurierbar ist. Wenn Sie stty -a
ausführen, können Sie sehen, welche Tastenfolge mit dem Signal intr
verknüpft ist. Dies wird wahrscheinlich sein CTRL-C Diese Tastenfolge kann jedoch vollständig auf etwas anderes abgebildet werden.
Das folgende Skript zeigt dies in Aktion (allerdings mit TERM
anstelle von INT
name__, da sleep
in meiner Umgebung nicht auf INT
reagiert):
#!/usr/bin/env bash
sleep 3600 &
pid=$!
sleep 5
echo ===
echo PID is $pid, before kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
( kill -TERM $pid ) 2>&1
sleep 5
echo ===
echo PID is $pid, after kill:
ps -ef | grep -E "PPID|$pid" | sed 's/^/ /'
echo ===
Es startet im Grunde genommen einen Stundenprotokollprozess sleep
und ermittelt dessen Prozess-ID. Anschließend werden die relevanten Prozessdetails ausgegeben, bevor der Prozess beendet wird.
Nach einer kurzen Wartezeit überprüft es die Prozesstabelle, um festzustellen, ob der Prozess beendet ist. Wie Sie der Ausgabe des Skripts entnehmen können, ist es in der Tat weg:
===
PID is 28380, before kill:
UID PID PPID TTY STIME COMMAND
pax 28380 24652 tty42 09:26:49 /bin/sleep
===
./qq.sh: line 12: 28380 Terminated sleep 3600
===
PID is 28380, after kill:
UID PID PPID TTY STIME COMMAND
===
Sie können die PID eines bestimmten Prozesses wie MySQL erhalten, indem Sie die folgenden Befehle verwenden: Ps -e | pgrep mysql
Dieser Befehl gibt Ihnen die PID des MySQL-Prozesses. 13954Now, geben Sie folgenden Befehl am Terminal . kill -9 13954 .__ ein. Dadurch wird der Prozess von MySQL beendet.
pgrep -f process_name > any_file_name
sed -i 's/^/kill /' any_file_name
chmod 777 any_file_name
./any_file_name
beispiel: 'pgrep -f firefox' grept die PID des 'firefox' und speichert diese PID in einer Datei namens 'any_file_name'. Der Befehl 'sed' fügt den 'kill' am Anfang der PID-Nummer in der Datei 'any_file_name' ein. Die dritte Zeile macht die Datei 'any_file_name' ausführbar. In der vierten Zeile wird nun die in der Datei 'any_file_name' verfügbare PID gelöscht. Das Schreiben der obigen vier Zeilen in eine Datei und das Ausführen dieser Datei kann das Steuerelement C ausführen. Absolut gut für mich.