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?

47
demandé sur Adrian Frühwirth 2011-04-26 15:28:12

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
59
répondu Matthieu Napoli 2013-10-17 12:23:58

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
===
11
répondu paxdiablo 2015-12-08 01:30:58

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.

0
répondu Muhammad Karam Shehzad 2017-03-17 11:35:31
    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.

0
répondu user2176228 2017-04-17 06:48:32