it-swarm.com.de

Wie sende ich Control + C aus einem Bash-Skript?

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?

50
ghickman

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
66
Matthieu Napoli

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 processIDzu 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 intrverknü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 TERManstelle von INTname__, da sleepin meiner Umgebung nicht auf INTreagiert):

#!/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 sleepund 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
===
12
paxdiablo

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.

0
user2176228