Signal — Commande Linux/Unix

click fraud protection

Linux prend en charge à la fois les signaux fiables POSIX (ci-après, « signaux standard ») et les signaux POSIX en temps réel.

Utiliser des signaux sous Linux

Les signaux sur un système Linux indiquent au système opérateur comment gérer un programme ou un processus en cours d'exécution. Lorsque vous fermez un programme normalement, cela envoie en fait un signal au système lui demandant de fermer le programme. Vous pouvez également le faire manuellement.

Commencez par rechercher un processus que vous souhaitez arrêter. Vous pouvez le faire avec:

ps aux | grep -i 

Donc, si vous souhaitez fermer Firefox à partir de la ligne de commande, saisissez:

ps aux | grep -i firefox

Vous obtiendrez une énorme liste de processus de Firefox car c'est une application multithread. Recherchez le processus de base pour /usr/lib/firefox. C'est généralement le premier.

Liste des processus Linux Firefox

Si vous trouvez cela accablant, vous pouvez également utiliser pgrep. Cela fonctionne de la même manière mais ne vous donne que les identifiants de processus.

pgrep firefox. 

L'ID de processus le plus bas sera le processus de base dont vous avez besoin.

Linux pgrep Firefox

Lorsque vous l'avez, recherchez le numéro d'identification du processus. La première chose répertoriée sera toujours l'utilisateur exécutant le processus. Vient ensuite l'ID de processus. Avec cela en main, vous pouvez envoyer un SIGTERM signaler au processus de l'arrêter en utilisant le tuer la commande.

tuer -SIGTERM 4790. 
Linux SIGTERM Firefox

Chaque signal a également un numéro correspondant pour la sténographie. Le numéro de SIGTERM est 15, vous pouvez donc l'utiliser de la même manière que le mot complet.

tuer -15 4790

SIGTERM est en fait l'action par défaut de la commande kill. En conséquence, vous n'avez en fait pas besoin de le spécifier du tout. Utilisez simplement:

tuer 4790

Vous obtiendrez exactement le même résultat.

C'est très bien si le processus est réactif, mais vous n'arrêterez probablement pas un processus réactif de cette façon, du moins pas sur un ordinateur de bureau. Alors, que faites-vous avec un processus qui ne répond pas? Il y a une tonne de signaux possibles. Pour une meilleure idée de l'étendue de la gamme, recherchez-les.

tuer -l
Liste des signaux Linux

Oui, il y en a beaucoup. Heureusement, vous ne toucherez pas à la grande majorité, à moins que vous ne commenciez à développer ou à écrire des scripts d'administration système. Le plus souvent, lorsque SIGTERM ne parvient pas à arrêter un processus qui ne répond pas, vous allez vous tourner vers l'équivalent Linux de Ctrl+Alt+Suppr, SIGKILL.

Contrairement au tristement célèbre gestionnaire de processus Ctrl+Alt+Suppr, SIGKILL fonctionne réellement. En fait, il s'agit d'ignorer tous les autres facteurs et de supprimer le processus incriminé, quoi qu'il arrive. Cela signifie également que SIGKILL peut être dangereux si vous vous trompez dans le processus.

Commencez exactement de la même manière, en recherchant l'ID de processus.

pgrep firefox

Maintenant, au lieu d'utiliser SIGTERM pour arrêter le processus, utilisez le SIGKILL, plus destructeur.

tuer -SIGKILL 4790

Même si le processus est complètement verrouillé, il devrait se fermer en quelques secondes.

Linux SIGKILL Firefox

Tout comme avec SIGTERM, il y a un numéro correspondant à SIGKILL. Dans ce cas, c'est 9.

tuer -9 4790

Tout comme avant, le processus devrait être mort presque immédiatement.

Vous devez également être conscient de SIGINT. Il s'agit d'une interruption du clavier, et c'est plus de commandes que vous ne le pensez dans la ligne de commande. Lorsque vous appuyez Ctrl+C pour arrêter un processus à partir d'une fenêtre de terminal, vous émettez en fait un SIGINT. Son code est 2, et vous pouvez l'utiliser comme les autres avec la commande kill.

tuer -2 4790

Ce n'est pas très courant puisque vous êtes beaucoup plus susceptible d'aller avec Ctrl+C, mais c'est bien d'en être conscient.

Ce sont de loin les signaux les plus courants que vous rencontrerez dans votre utilisation quotidienne de Linux. Pour une description plus technique des autres signaux, passez à la section suivante.

Les détails techniques

Si vous êtes un administrateur système ou que vous cherchez à développer pour Linux, vous voudrez probablement approfondir les détails techniques derrière le système de signal sous Linux. La section suivante explore la ventilation technique complète des signaux Linux. Vous n'avez absolument pas besoin de ces informations pour utiliser Linux sur votre bureau, mais si vous avez l'intention d'explorer le fonctionnement interne du système, elles peuvent s'avérer inestimables.

Signaux standards

Linux prend en charge les signaux standard répertoriés ci-dessous. Plusieurs numéros de signal dépendent de l'architecture, comme indiqué dans la colonne "Valeur". (Là où trois valeurs sont données, la première est généralement valable pour alpha et sparc, celle du milieu pour i386, ppc et sh, et la dernière pour mips. A - indique qu'un signal est absent sur l'architecture correspondante.)

Les entrées de la colonne "Action" du tableau spécifient l'action par défaut pour le signal, comme suit:

Terme:L'action par défaut consiste à terminer le processus.

Ign: L'action par défaut consiste à ignorer le signal.

Coeur: L'action par défaut consiste à terminer le processus et à vider le noyau.

Arrêter:L'action par défaut est d'arrêter le processus.

Premièrement, les signaux décrits dans la norme POSIX.1 d'origine.

Signal Valeur action Commenter
ou la mort du processus de contrôle
SIGINT 2 Terme Interruption depuis le clavier
SIGQUIT 3 Coeur Quitter depuis le clavier
SIGILL 4 Coeur Instruction illégale
SIGABRT 6 Coeur Abandonner le signal de avorter(3)
SIGFPE 8 Coeur Exception à virgule flottante
SIGKILL 9 Terme Signal de mise à mort
SIGSEGV 11 Coeur Référence mémoire invalide
SIGPIPE 13 Terme Tuyau cassé: écrivez dans le tuyau sans lecteurs
SIGALRM 14 Terme Signal de minuterie de alarme(2)
SIGTERM 15 Terme Signal de terminaison
SIGUSR1 30,10,16 Terme Signal défini par l'utilisateur 1
SIGUSR2 31,12,17 Terme Signal défini par l'utilisateur 2
SIGCHLD 20,17,18 Ign Enfant arrêté ou terminé
SIGCONT 19,18,25 Continuer si arrêté
SIGSTOP 17,19,23 Arrêter Arrêter le processus
SIGTSTP 18,20,24 Arrêter Arrêter tapé sur tty
SIGTTIN 21,21,26 Arrêter entrée tty pour le processus d'arrière-plan
SIGTTOU 22,22,27 Arrêter sortie tty pour le processus d'arrière-plan

Les signaux SIGKILL et SIGSTOP ne peut pas être intercepté, bloqué ou ignoré.

Ensuite, les signaux ne sont pas dans la norme POSIX.1 mais décrits dans SUSv2 et SUSv3 / POSIX 1003.1-2001.

Signal Valeur action Commenter
SIGROL Terme Evénement sondable (Sys V). Le synonyme de SIGIO
SIGPROF 27,27,29 Terme La minuterie de profilage a expiré
SIGSYS 12,-,12 Coeur Mauvais argument à la routine (SVID)
SIGTRAP 5 Coeur Trappe de trace/point d'arrêt
SIGURG 16,23,21 Ign Condition urgente sur le socket (4.2 BSD)
SIGVTALRM 26,26,28 Terme Réveil virtuel (4.2 BSD)
SIGXCPU 24,24,30 Coeur Limite de temps CPU dépassée (4.2 BSD)
SIGXFSZ 25,25,31 Coeur Limite de taille de fichier dépassée (4.2 BSD)

Jusqu'à et y compris Linux 2.2, le comportement par défaut pour SIGSYS, SIGXCPU, SIGXFSZ, et (sur les architectures autres que SPARC et MIPS) SIGBUS était de terminer le processus (sans un vidage de mémoire). (Sur certains autres Unice, l'action par défaut pour SIGXCPU et SIGXFSZ est de terminer le processus sans vidage de mémoire.) Linux 2.4 est conforme aux exigences POSIX 1003.1-2001 pour ces signaux, mettant fin au processus avec un vidage de mémoire.

Ensuite, divers autres signaux.

Signal Valeur action Commenter
SIGEMT 7,-,7 Terme
SIGSTKFLT -,16,- Terme Erreur de pile sur le coprocesseur (inutilisé)
SIGIO 23,29,22 Terme E/S désormais possible (4.2 BSD)
SIGCLD -,-,18 Ign Un synonyme de SIGCHLD
SIGPWR 29,30,19 Terme Panne de courant (Système V)
SIGINFO 29,-,- Un synonyme de SIGPWR
SIGLOST -,-,- Terme Verrouillage de fichier perdu
SIGNALISATION 28,28,20 Ign Signal de redimensionnement de la fenêtre (4.3 BSD, Sun)
SIGUNUSE -,31,- Terme Signal inutilisé (sera SIGSYS)

(Le signal 29 est SIGINFO / SIGPWR sur un alpha mais SIGLOST sur un sparc.)

SIGEMT n'est pas spécifié dans POSIX 1003.1-2001, mais apparaît néanmoins sur la plupart des autres Unices, où son action par défaut est généralement de terminer le processus avec un core dump.

SIGPWR (qui n'est pas spécifié dans POSIX 1003.1-2001) est généralement ignoré par défaut sur les autres Unices où il apparaît.

SIGIO (qui n'est pas spécifié dans POSIX 1003.1-2001) est ignoré par défaut sur plusieurs autres Unice.

Signaux en temps réel

Linux prend en charge les signaux temps réel tels que définis à l'origine dans les extensions temps réel POSIX.4 (et maintenant inclus dans POSIX 1003.1-2001). Linux prend en charge 32 signaux en temps réel, numérotés à partir de 32 (SIGRTMIN) à 63 (SIGRTMAX). (Les programmes doivent toujours se référer à des signaux en temps réel en utilisant la notation SIGRTMIN+n, puisque la plage de numéros de signaux en temps réel varie selon les Unices.)

Contrairement aux signaux standard, les signaux en temps réel n'ont pas de signification prédéfinie: l'ensemble des signaux en temps réel peut être utilisé à des fins définies par l'application. (Notez, cependant, que l'implémentation LinuxThreads utilise les trois premiers signaux en temps réel.)

L'action par défaut pour un signal en temps réel non géré est de terminer le processus de réception.

Les signaux en temps réel se distinguent par les éléments suivants:

  1. Plusieurs instances de signaux en temps réel peuvent être mises en file d'attente. En revanche, si plusieurs instances d'un signal standard sont délivrées alors que ce signal est actuellement bloqué, alors une seule instance est mise en file d'attente.
  2. Si le signal est envoyé en utilisant file d'attente(2), une valeur d'accompagnement (soit un entier soit un pointeur) peut être envoyée avec le signal. Si le processus de réception établit un gestionnaire pour ce signal à l'aide de la SA_SIGACTION drapeau à signature(2) alors il peut obtenir ces données via lesi_valeur domaine de la siginfo_t structure passée comme deuxième argument au gestionnaire. De plus, le si_pid et si_uid Les champs de cette structure peuvent être utilisés pour obtenir le PID et l'ID utilisateur réel du processus envoyant le signal.
  3. Les signaux en temps réel sont livrés dans un ordre garanti. Plusieurs signaux en temps réel du même type sont délivrés dans l'ordre dans lequel ils ont été envoyés. Si différents signaux en temps réel sont envoyés à un processus, ils sont délivrés en commençant par le signal le plus petit. (C'est-à-dire que les signaux de faible numéro ont la priorité la plus élevée.)

Si à la fois des signaux standard et en temps réel sont en attente pour un processus, POSIX ne spécifie pas celui qui est délivré en premier. Linux, comme beaucoup d'autres implémentations, donne la priorité aux signaux standard dans ce cas.

Selon POSIX, une implémentation devrait permettre au moins _POSIX_SIGQUEUE_MAX (32) signaux en temps réel d'être mis en file d'attente pour un processus. Cependant, plutôt que de placer une limite par processus, Linux impose une limite à l'échelle du système sur le nombre de signaux en temps réel en file d'attente pour tous les processus. Cette limite peut être consultée (et avec privilège) modifiée via le /proc/sys/kernel/rtsig-max déposer. Un dossier associé,/proc/sys/kernel/rtsig-max, peut être utilisé pour savoir combien de signaux en temps réel sont actuellement en file d'attente.

SE CONFORMER À.

POSIX.1.

Utilisez le homme commande (% homme) pour voir comment une commande est utilisée sur votre ordinateur particulier.