Un processus est considéré comme terminé correctement sous Linux si son état de sortie était 0.
J'ai vu que les erreurs de segmentation entraînent souvent un état de sortie de 11, bien que je ne sais pas si c'est simplement la convention où je travaille (les applications qui ont échoué comme ça ont toutes été internes) ou une norme.
Existe-t-il des codes de sortie standard pour les processus sous Linux?
linux
error-handling
exit-code
Nathan Fellman
la source
la source
Réponses:
8 bits du code retour et 8 bits du numéro du signal de suppression sont mélangés en une seule valeur au retour de
wait(2)
& co. .Comment déterminez-vous le statut de sortie? Traditionnellement, le shell stocke uniquement un code retour 8 bits, mais définit le bit haut si le processus s'est terminé anormalement.
Si vous voyez autre chose que cela, alors le programme a probablement un
SIGSEGV
gestionnaire de signal qui appelle ensuiteexit
normalement, donc il n'est pas réellement tué par le signal. (Les programmes peuvent choisir de gérer tous les signaux en dehors deSIGKILL
etSIGSTOP
.)la source
Partie 1: Guide de script Bash avancé
Comme toujours, le Guide de script avancé Bash contient d' excellentes informations : (Cela a été lié dans une autre réponse, mais à une URL non canonique.)
Partie 2: sysexits.h
Les références ABSG
sysexits.h
.Sous Linux:
la source
man sysexits
sysexits.h
? La page de manuel à laquelle tout le monde fait référence n'est que de la prose. Par exemple, il fait référenceEX_OK
mais ne le définit pas de manière normative comme les autres codes. Y en a-t-il d'autres qui manquent?'1' >>> Catchall pour les erreurs générales
'2' >>> Mauvais usage des commandes internes de shell (selon la documentation de Bash)
'126' >>> La commande invoquée ne peut pas s'exécuter
'127' >>> "commande introuvable"
'128' >>> Argument invalide pour quitter
'128 + n' >>> Signal d'erreur fatale "n"
'130' >>> Script terminé par Control-C
'255' >>> Etat de sortie hors plage
C'est pour bash. Cependant, pour d'autres applications, il existe différents codes de sortie.
la source
Aucune des réponses plus anciennes ne décrit correctement l'état de sortie 2. Contrairement à ce qu'ils prétendent, le statut 2 correspond à ce que vos utilitaires de ligne de commande retournent réellement lorsqu'ils sont appelés de manière incorrecte. (Oui, une réponse peut avoir neuf ans, avoir des centaines de votes positifs et toujours avoir tort.)
Voici la convention de statut de sortie réelle et de longue date pour la terminaison normale, c'est-à-dire pas par signal:
Par exemple,
diff
renvoie 0 si les fichiers qu'il compare sont identiques et 1 s'ils diffèrent. Par convention de longue date, les programmes unix retournent état de sortie 2 lorsqu'il est appelé de manière incorrecte ( les options inconnues, mauvais nombre d'arguments, etc.) Par exemple,diff -N
,grep -Y
oudiff a b c
generera à$?
être mis à 2. Ceci est et a été la pratique depuis la premiers jours d'Unix dans les années 1970.La réponse acceptée explique ce qui se passe lorsqu'une commande se termine par un signal. En bref, la résiliation en raison d'un signal non capturé entraîne un état de sortie
128+[<signal number>
. Par exemple, la terminaison parSIGINT
( signal 2 ) entraîne l'état de sortie 130.Remarques
Plusieurs réponses définissent le statut de sortie 2 comme "Mauvaise utilisation des commandes bash". Cela s'applique uniquement lorsque bash (ou un script bash) se termine avec le statut 2. Considérez-le comme un cas particulier d'erreur d'utilisation incorrecte.
Dans
sysexits.h
, mentionné dans la réponse la plus populaire , l'état de sortieEX_USAGE
("erreur d'utilisation de la ligne de commande") est défini comme étant 64. Mais cela ne reflète pas la réalité: je ne connais aucun utilitaire Unix commun qui renvoie 64 en cas d'appel incorrect (exemples bienvenus ). Une lecture attentive du code source révèle quesysexits.h
c'est de l'aspiration, plutôt qu'un reflet de la véritable utilisation:En d'autres termes, ces définitions ne reflètent pas la pratique courante à l'époque (1993) mais étaient intentionnellement incompatibles avec elle. Plus c'est dommage.
la source
more
réinitialise les modes du terminal et quitte avec le statut 0 (vous pouvez l'essayer).Il n'y a pas de code de sortie standard, à part 0 signifiant succès. Non nul n'est pas nécessairement synonyme d'échec non plus.
stdlib.h définit
EXIT_FAILURE
comme 1 etEXIT_SUCCESS
comme 0, mais c'est à peu près tout.Le 11 sur segfault est intéressant, car 11 est le numéro de signal que le noyau utilise pour tuer le processus en cas de segfault. Il existe probablement un mécanisme, que ce soit dans le noyau ou dans le shell, qui traduit cela en code de sortie.
la source
sysexits.h a une liste de codes de sortie standard. Cela semble remonter au moins à 1993 et certains grands projets comme Postfix l'utilisent, donc j'imagine que c'est la voie à suivre.
Depuis la page de manuel d'OpenBSD:
la source
Dans une première approximation, 0 est un succès, non nul est un échec, 1 étant un échec général et tout ce qui est supérieur à un étant un échec spécifique. Mis à part les exceptions triviales de faux et de test, qui sont toutes deux conçues pour donner 1 pour succès, il y a quelques autres exceptions que j'ai trouvées.
Plus réaliste, 0 signifie succès ou peut-être échec, 1 signifie échec général ou peut-être succès, 2 signifie échec général si 1 et 0 sont tous deux utilisés pour réussir, mais peut-être aussi.
La commande diff donne 0 si les fichiers comparés sont identiques, 1 s'ils diffèrent et 2 si les binaires sont différents. 2 signifie également l'échec. La commande less donne 1 pour échec, sauf si vous ne fournissez pas d'argument, auquel cas, elle quitte 0 malgré l'échec.
La commande more et la commande spell donnent 1 pour échec, sauf si l'échec est le résultat d'une autorisation refusée, d'un fichier inexistant ou d'une tentative de lecture d'un répertoire. Dans tous ces cas, ils quittent 0 malgré l'échec.
Ensuite, la commande expr donne 1 pour succès sauf si la sortie est la chaîne vide ou zéro, auquel cas, 0 est réussi. 2 et 3 sont un échec.
Ensuite, il y a des cas où le succès ou l'échec est ambigu. Lorsque grep ne parvient pas à trouver un modèle, il quitte 1, mais il quitte 2 pour un véritable échec (comme une autorisation refusée). Klist quitte également 1 lorsqu'il ne parvient pas à trouver un ticket, bien que ce ne soit pas plus un échec que lorsque grep ne trouve pas de modèle, ou lorsque vous ls un répertoire vide.
Donc, malheureusement, les pouvoirs Unix ne semblent imposer aucun ensemble logique de règles, même sur les exécutables très couramment utilisés.
la source
Les programmes renvoient un code de sortie 16 bits. Si le programme a été tué avec un signal, l'octet de poids fort contient le signal utilisé, sinon l'octet de poids faible est l'état de sortie renvoyé par le programmeur.
Comment ce code de sortie est affecté à la variable d'état $? est alors à la coquille. Bash conserve les 7 bits inférieurs de l'état, puis utilise 128 + (signal nr) pour indiquer un signal.
La seule convention "standard" pour les programmes est 0 pour le succès, non nulle pour l'erreur. Une autre convention utilisée est de retourner errno en cas d'erreur.
la source
Les codes de sortie Unix standard sont définis par sysexits.h, comme l'a mentionné une autre affiche. Les mêmes codes de sortie sont utilisés par les bibliothèques portables telles que Poco - en voici une liste:
http://pocoproject.org/docs/Poco.Util.Application.html#16218
Un signal 11 est un signal SIGSEGV (violation de segment), différent d'un code retour. Ce signal est généré par le noyau en réponse à un mauvais accès à la page, ce qui provoque l'arrêt du programme. Une liste de signaux peut être trouvée dans la page de manuel des signaux (exécutez "man signal").
la source
Lorsque Linux renvoie 0, cela signifie le succès. Tout le reste signifie un échec, chaque programme a ses propres codes de sortie, il aurait donc été assez long de tous les lister ...!
À propos du code d'erreur 11, il s'agit en effet du numéro de défaut de segmentation, ce qui signifie principalement que le programme a accédé à un emplacement mémoire qui n'a pas été attribué.
la source