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?
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
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 processID
spé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 intr
name__. 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 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 un processus sleep
et 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
===
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.
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.