Signal — Commande Linux/Unix
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.
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.
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.
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
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.
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:
- 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.
- 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.
- 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.