Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are there any standard exit status codes in Linux?

A process is considered to have completed correctly in Linux if its exit status was 0.

I've seen that segmentation faults often result in an exit status of 11, though I don't know if this is simply the convention where I work (the apps that failed like that have all been internal) or a standard.

Are there standard exit codes for processes in Linux?

like image 952
Nathan Fellman Avatar asked Jul 09 '09 05:07

Nathan Fellman


People also ask

What is exit status in Linux?

The exit status of an executed command is the value returned by the waitpid system call or equivalent function. Exit statuses fall between 0 and 255, though, as explained below, the shell may use values above 125 specially. Exit statuses from shell builtins and compound commands are also limited to this range.

What is exit status 255 Linux?

While trying to use SSH, you may get a response indicating permission is denied. Or if you get an error with a code of 255, it means there's a problem with your SSH connection.

What is exit status 1 Linux?

The only general convention is that a zero exit status signifies success, whereas any non-zero exit status is a failure. Many -- but certainly not all -- command-line tools return exit code 1 for syntax error, i.e. you had too few arguments or an invalid option.


2 Answers

Part 1: Advanced Bash Scripting Guide

As always, the Advanced Bash Scripting Guide has great information: (This was linked in another answer, but to a non-canonical URL.)

1: Catchall for general errors
2: Misuse of shell builtins (according to Bash documentation)
126: Command invoked cannot execute
127: "command not found"
128: Invalid argument to exit
128+n: Fatal error signal "n"
255: Exit status out of range (exit takes only integer args in the range 0 - 255)

Part 2: sysexits.h

The ABSG references sysexits.h.

On Linux:

$ find /usr -name sysexits.h /usr/include/sysexits.h $ cat /usr/include/sysexits.h  /*  * Copyright (c) 1987, 1993  *  The Regents of the University of California.  All rights reserved.   (A whole bunch of text left out.)  #define EX_OK           0       /* successful termination */ #define EX__BASE        64      /* base value for error messages */ #define EX_USAGE        64      /* command line usage error */ #define EX_DATAERR      65      /* data format error */ #define EX_NOINPUT      66      /* cannot open input */     #define EX_NOUSER       67      /* addressee unknown */     #define EX_NOHOST       68      /* host name unknown */ #define EX_UNAVAILABLE  69      /* service unavailable */ #define EX_SOFTWARE     70      /* internal software error */ #define EX_OSERR        71      /* system error (e.g., can't fork) */ #define EX_OSFILE       72      /* critical OS file missing */ #define EX_CANTCREAT    73      /* can't create (user) output file */ #define EX_IOERR        74      /* input/output error */ #define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */ #define EX_PROTOCOL     76      /* remote error in protocol */ #define EX_NOPERM       77      /* permission denied */ #define EX_CONFIG       78      /* configuration error */  #define EX__MAX 78      /* maximum listed value */ 
like image 113
Schof Avatar answered Oct 07 '22 20:10

Schof


8 bits of the return code and 8 bits of the number of the killing signal are mixed into a single value on the return from wait(2) & co..

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h>  int main() {     int status;      pid_t child = fork();     if (child <= 0)         exit(42);     waitpid(child, &status, 0);     if (WIFEXITED(status))         printf("first child exited with %u\n", WEXITSTATUS(status));     /* prints: "first child exited with 42" */      child = fork();     if (child <= 0)         kill(getpid(), SIGSEGV);     waitpid(child, &status, 0);     if (WIFSIGNALED(status))         printf("second child died with %u\n", WTERMSIG(status));     /* prints: "second child died with 11" */ } 

How are you determining the exit status? Traditionally, the shell only stores an 8-bit return code, but sets the high bit if the process was abnormally terminated.

 $ sh -c 'exit 42'; echo $? 42 $ sh -c 'kill -SEGV $$'; echo $? Segmentation fault 139 $ expr 139 - 128 11 

If you're seeing anything other than this, then the program probably has a SIGSEGV signal handler which then calls exit normally, so it isn't actually getting killed by the signal. (Programs can chose to handle any signals aside from SIGKILL and SIGSTOP.)

like image 25
ephemient Avatar answered Oct 07 '22 21:10

ephemient