Comment envoyer ctrl+c à partir d'un script bash?
Je démarre un certain nombre d'écrans dans un script bash, puis j'exécute la commande runserver
de django dans chacun d'eux. J'aimerais pouvoir les arrêter tous par programme, ce qui m'oblige à envoyer Control+c
à runserver
.
Comment puis-je envoyer ces frappes à partir de mon script bash?
4 réponses
Ctrl+C envoie un SIGINT
signal.
kill -INT <pid>
envoie aussi un signal SIGINT
:
# Terminates the program (like Ctrl+C)
kill -INT 888
# Force kill
kill -9 888
En supposant que 888
est votre identifiant de processus.
Notez que kill 888
envoie un signal SIGTERM
, qui est légèrement différent, mais demandera également l'arrêt du programme. Donc, si vous savez ce que vous faites (aucun gestionnaire lié à SIGINT
dans le programme), un simple kill
suffit.
Pour obtenir le PID de la dernière commande lancée dans votre script, utilisez $!
:
# Launch script in background
./my_script.sh &
# Get its PID
PID=$!
# Wait for 2 seconds
sleep 2
# Kill it
kill $PID
CTRL-C envoie généralement un signal SIGINT au processus de sorte que vous pouvez simplement faire:
kill -INT <processID>
À partir de la ligne de commande (ou d'un script), pour affecter le processID
spécifique.
Je dis "généralement" parce que, comme avec la plupart des UNIX, c'est presque infiniment configurable. Si vous exécutez stty -a
, Vous pouvez voir quelle séquence de touches est liée au signal intr
. Ce sera probablement CTRL-C mais cette séquence de clés peut être mappée à autre chose entièrement.
Le le script suivant le montre en action (bien qu'avec TERM
plutôt que INT
puisque sleep
ne réagit pas à INT
dans mon environnement):
#!/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 ===
Il démarre essentiellement un processus hour-log sleep
et récupère son ID de processus. Il affiche ensuite les détails du processus pertinents avant de tuer le processus.
Après une petite attente, il vérifie ensuite la table de processus pour voir si le processus a disparu. Comme vous pouvez le voir à partir de la sortie du script, il est en effet parti:
===
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
===
Vous pouvez obtenir le PID d'un processus particulier comme MySQL en utilisant les commandes suivantes: ps-e / pgrep mysql
Cette commande vous donnera le PID de MySQL rocess. e.g, 13954 Maintenant, tapez la commande suivante sur le terminal. tuer -9 13954 Cela va tuer le processus de MySQL.
pgrep -f process_name > any_file_name
sed -i 's/^/kill /' any_file_name
chmod 777 any_file_name
./any_file_name
Par exemple, 'pgrep-f firefox' va grep le PID de l'exécution de 'firefox' et va enregistrer CE PID dans un fichier appelé 'any_file_name'. la commande ' sed 'ajoutera le' kill 'au début du numéro PID dans le fichier 'any_file_name'. La troisième ligne rendra le fichier' any_file_name ' exécutable. Maintenant, la quatrième ligne va tuer le PID disponible dans le fichier 'any_file_name'. Écrire les quatre lignes ci-dessus dans un fichier et exécuter ce fichier peut faire le contrôle-C. travailler absolument bien pour moi.