web-dev-qa-db-fra.com

Comment envoyer control + c depuis 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 par programme également, ce qui nécessite que j'envoie Control+c à runserver.

Comment puis-je envoyer ces frappes au clavier à partir de mon script bash?

50
ghickman

Ctrl+C envoie un signal SIGINT.

kill -INT <pid> envoie également 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 à ce que le programme s’arrête. 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
66
Matthieu Napoli

CTRL-C envoie généralement un signal SIGINT au processus afin que vous puissiez simplement faire:

kill -INT <processID>

à partir de la ligne de commande (ou d’un script), pour affecter le processIDspécifique.

Je dis "généralement" car, comme dans la plupart des systèmes UNIX, il est configurable à l'infini. Si vous exécutez stty -a, vous pouvez voir quelle séquence de clés est liée au signal intrname__. Ce sera probablement CTRL-C mais cette séquence de touches peut être entièrement mappée.


Le script suivant montre cela en action (quoique avec TERM_ plutôt que INTpuisque sleepne réagit pas à INTdans 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 un processus sleepet enregistre son ID de processus. Il génère ensuite les détails de 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 est terminé. Comme vous pouvez le voir à 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
===
12
paxdiablo

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 du traitement de MySQL. Par exemple, 13954Maintenant, tapez la commande suivante sur le terminal . kill -9 13954 Cela supprimera le processus MySQL.

0
    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 sauvegardera ce PID dans un fichier nommé 'nom_fichier_tout'. 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. La quatrième ligne supprimera le PID disponible dans le fichier 'any_file_name'. L'écriture des quatre lignes ci-dessus dans un fichier et son exécution peuvent permettre le contrôle-C. Travailler absolument bien pour moi.

0
user2176228