4 votes

Pourquoi `kill %jobnumber` ne fonctionne-t-il pas sur les travaux arrêtés ?

J'exécute quelques tâches côte à côte sur un système Ubuntu 18 LTS. Je bascule donc entre ces tâches en exécutant :

# command &
# fg
# fg -

J'utilise également Ctrl + Z parfois pour envoyer un travail en cours en arrière-plan.

Disons que j'ai 3 emplois dans ma liste :

# jobs
[1]+  Stopped                 nano /etc/nginx/site-available/blog.conf
[2]   Stopped                 top
[3]-  Stopped                 nano script.sh

Je peux passer de l'un à l'autre avec succès, mais lorsque j'exécute la fonction kill sur ceux-ci, les travaux apparaissent toujours dans la liste. Aucun n'est tué. Pourquoi ?

# kill %1

Je fais une nouvelle liste, et les emplois sont toujours là :

# jobs
[1]+  Stopped                 nano /etc/nginx/site-available/blog.conf
[2]   Stopped                 top
[3]-  Stopped                 nano script.sh

PS : Je peux tuer des travaux avec leurs ID de processus, mais pourquoi pas avec kill %1 ?

4voto

Ravexina Points 50599

Il y a deux choses à souligner ici :

  1. kill sans aucun argument envoie un SIGTERM à l'identifiant du processus ou du travail souhaité.

  2. SIGTERM peuvent être ignorés par le processus qui les reçoit.

  3. Un processus qui a été arrêté (relancé a SIGSTOP par exemple en utilisant Ctrl + z ) ne peut rien faire (enregistrer un fichier, etc.).

Lorsque vous exécutez kill sans argument sur un processus qui a besoin d'étapes spécifiques pour être fermé mais qui ne le peut pas (parce qu'il est arrêté), il ne répond pas à la commande SIGTERM et l'ignore. D'autre part SIGKILL ne peut pas être ignorée, donc elle tue le processus. c'est pourquoi une commande comme sleep peuvent être terminés par kill %1 très bien, mais un programme comme nano ne peut pas.

3voto

Gryu Points 6277

Si vous ne pouviez pas tuer un processus par son PID, alors vous ne pouviez pas le tuer en utilisant l'identifiant de sa tâche.

Pour tuer un processus en utilisant l'identifiant de son travail sans sauvegarder les données, fermer les opérations de session, etc., utilisez :

kill -9 %1

kill envoie le signal numéro 15 (SIGTERM) au processus, qui pourrait être ignoré par le processus comme dans notre cas, parce qu'il est arrêté et, peut-être, rejette d'écouter SIGTERM dans l'état arrêté. Mais le signal numéro 9 (SIGKILL) est envoyé par le noyau et il ne se soucie pas de savoir si le processus peut l'entendre ou non. Il l'arrête simplement de force.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X