- Standard Exit Status Codes in Linux
- 1. Overview
- 2. Exit Codes
- 3. Special Exit Codes
- 3.1. General Error: 1
- 3.2. Misuse of Shell Built-in: 2
- 3.3. Cannot Execute: 126
- 3.4. Command Not Found: 127
- 3.5. Invalid Argument To Exit: 128
- 3.6. Fatal Error Signal ‘n‘: 128+n
- 3.7. Exit Status Out of Range: 255
- 4. Exit Codes Above 255
- 5. Conclusion
- List of exit codes on Linux
- List of exit codes on Linux
- Closing Thoughts
- Related Linux Tutorials:
- Как использовать коды завершения в Bash-скриптах
- Что такое коды завершения
- Что происходит, когда коды завершения не определены
- Как использовать коды завершения в Bash-скриптах
- Проверяем коды завершения
- Создаём собственный код завершения
- Как использовать коды завершения в командной строке
- Дополнительные коды завершения
Standard Exit Status Codes in Linux
The Kubernetes ecosystem is huge and quite complex, so it’s easy to forget about costs when trying out all of the exciting tools.
To avoid overspending on your Kubernetes cluster, definitely have a look at the free K8s cost monitoring tool from the automation platform CAST AI. You can view your costs in real time, allocate them, calculate burn rates for projects, spot anomalies or spikes, and get insightful reports you can share with your team.
Connect your cluster and start monitoring your K8s costs right away:
1. Overview
In Linux, when a process is terminated, it returns an exit code. Upon successful execution, this code is equal to zero. Any non-zero exit code indicates that some error occurred.
Although we’re free to choose what exit codes we use in our scripts and programs, there are some standard codes that have a special meaning. In this tutorial, we’ll have a look at these codes and what they mean.
2. Exit Codes
In shell scripts, we use the exit command to generate exit codes. By using different exit codes for different errors, we can give an indication of what went wrong.
The exit command takes one argument, the exit code we want to use. For example:
As we’ve already learned from the overview, some exit codes have special meanings. However, this doesn’t mean we can’t use them. They’re special, not reserved.
Also, some special codes might have different meanings in different shells. The examples in this article apply to the Bash shell.
3. Special Exit Codes
Let’s have a look at some special codes.
3.1. General Error: 1
This is the most used exit code and should be used as a catch-all value for miscellaneous errors.
3.2. Misuse of Shell Built-in: 2
Exit code 2 signifies invalid usage of some shell built-in command. Examples of built-in commands include alias, echo, and printf.
3.3. Cannot Execute: 126
In this case, the command invoked can’t be executed. This will most likely occur when there’s a permission problem or the command isn’t executable.
3.4. Command Not Found: 127
A command couldn’t be found. This may happen, for example, because there was a typo or an issue with our PATH.
3.5. Invalid Argument To Exit: 128
The exit command only takes a positive integer as its argument. This means any negative, fractional, or non-numeric values aren’t allowed.
3.6. Fatal Error Signal ‘n‘: 128+n
In Linux, programs might send one of 33 different signals. When a program terminates after receiving one of these signals, it will return an error code equal to 128 + signal-number.
For example, when we terminate a program by typing Control-C, we’re effectively sending it a SIGINT signal. This signal has a value of 2, therefore, the program will stop its execution and return an exit code with a value 128 + 2 = 130.
3.7. Exit Status Out of Range: 255
Depending on our shell, exit code 255 might mean that the returned exit code is outside of the 0-255 range.
4. Exit Codes Above 255
Because exit codes are represented by a single byte value, the highest possible exit code is 255. However, nothing prevents us from returning exit codes larger than this. Values over 255 are out of range and get wrapped around.
We should be very careful as this can be a source of unexpected results. For example, the exit code of 383 will be wrapped around and result in an effective exit code of 127, which translates to “command not found”:
$ bash -c "exit 383" echo $? 127
While it’s allowed to return exit values over 255, it’s better to avoid it at all times.
5. Conclusion
In this article, we’ve learned which exit codes should be treated as reserved and when we can use them in the scripts and programs we write. Some of them we should never use as it would be very confusing for our users.
We have to remember that different shells might have different special exit codes. This is something to be aware of.
Also, when writing programs or scripts, we should document the exit codes we use as a courtesy to our users.
List of exit codes on Linux
When a script or process exits or is terminated by some other means, it will have an exit code, which gives some indication about how or why the script or process ended. For example, an exit code of 0 means that the process exited without error – in other words, it completed its task and exited as expected. On the other hand, an exit code of 1 means that the process encountered some kind of error upon exiting.
In addition to those two exit codes, there are a slew of other reserved codes in Bash that have their own meanings. In this tutorial, we will show you a list of exit codes on a Linux system, and explain what each of them mean.
In this tutorial you will learn:
- What is an exit code in Linux?
- How to retrieve an exit code in Bash
- List of reserved exit codes in Bash
Category | Requirements, Conventions or Software Version Used |
---|---|
System | Any Linux distro |
Software | Bash shell |
Other | Privileged access to your Linux system as root or via the sudo command. |
Conventions | # – requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command $ – requires given linux commands to be executed as a regular non-privileged user |
List of exit codes on Linux
Now that you know what an exit code is, let’s see how to retrieve the exit code for a script or process that has ended. As an example, we will run a short script and then view its exit code. The command to see an exit code is echo $?
In the example above, we have an exit code of 0, implying that the script terminated as expected.
You will find a list of exit codes and their meanings in the table below.
Exit code | Description |
---|---|
0 | Successful exit without errors |
1 | One or more generic errors encountered upon exit |
2 | Incorrect usage, such as invalid options or missing arguments |
126 | Command found but is not executable |
127 | Command not found, usually the result of a missing directory in $PATH variable |
128+N | Command encountered fatal error (was forcefully terminated manually or from an outside source). The N tells us which signal was received (see example below) |
130 | Command terminated with signal 2 (SIGINT) (ctrl+c on keyboard). 128+2 |
143 | Command terminated with signal 15 (SIGTERM) (kill command). 128+15 |
Closing Thoughts
In this tutorial, we learned about what an exit code is in Bash, how to retrieve an exit code, and a list of common exit codes and their meanings on a Linux system. Retrieving exit codes and knowing their meanings is important for a Linux administrator in order to determine how or why a process or script ended. The exit codes can tell you if the script exited gracefully or if an error occurred.
Related Linux Tutorials:
Comments and Discussions
Как использовать коды завершения в Bash-скриптах
Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.
Что такое коды завершения
В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.
Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.
Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.
Что происходит, когда коды завершения не определены
В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.
#!/bin/bash touch /root/test echo created file
Этот скрипт запускает команды touch и echo . Если запустить этот скрипт без прав суперпользователя, команда touch не выполнится. В этот момент мы хотели бы получить информацию об ошибке с помощью соответствующего кода завершения. Чтобы проверить код выхода, достаточно ввести в командную строку специальную переменную $? . Она печатает код возврата последней запущенной команды.
Как видно, после запуска команды ./tmp.sh получаем код завершения 0 . Этот код говорит об успешном выполнении команды, хотя на самом деле команда не выполнилась. Скрипт из примера выше исполняет две команды: touch и echo . Поскольку код завершения не определён, получаем код выхода последней запущенной команды. Это команда echo , которая успешно выполнилась.
Если убрать из скрипта команду echo , можно получить код завершения команды touch .
Поскольку touch в данном случае — последняя запущенная команда, и она не выполнилась, получаем код возврата 1 .
Как использовать коды завершения в Bash-скриптах
Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch ? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.
Проверяем коды завершения
Выше мы пользовались специальной переменной $? , чтобы получить код завершения скрипта. Также с помощью этой переменной можно проверить, выполнилась ли команда touch успешно.
#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" else echo "Could not create file" >&2 fi
После рефакторинга скрипта получаем такое поведение:
- Если команда touch выполняется с кодом 0 , скрипт с помощью echo сообщает об успешно созданном файле.
- Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.
Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr .
Создаём собственный код завершения
Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0 .
Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit .
#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" exit 0 else echo "Could not create file" >&2 exit 1 fi
Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0 . В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1 .
Как использовать коды завершения в командной строке
Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.
В примере выше && используется для обозначения «и», а || для обозначения «или». В данном случае команда выполняет скрипт ./tmp.sh , а затем выполняет echo «bam» , если код завершения 0 . Если код завершения 1 , выполняется следующая команда в круглых скобках. Как видно, в скобках для группировки команд снова используются && и || .
Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.
Дополнительные коды завершения
Команда exit принимает числа от 0 до 255 . В большинстве случаев можно обойтись кодами 0 и 1 . Однако есть зарезервированные коды, которые обозначают конкретные ошибки. Список зарезервированных кодов можно посмотреть в документации.
Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.