在Linux中,如果进程的退出状态为0,则认为该进程已正确完成。

我看到分割错误经常导致退出状态为11,尽管我不知道这只是我工作的地方的惯例(像这样失败的应用程序都是内部的)还是一种标准。

Linux中进程有标准的退出码吗?


当前回答

有些是惯例,但其他一些保留的是POSIX标准的一部分。

126—找到要执行的文件,但它不是可执行实用程序。 127—没有找到要执行的实用程序。 >128—命令被信号中断。

参见man 1p退出的基本原理部分。

其他回答

当Linux返回0时,意味着成功。其他都意味着失败。每个程序都有自己的退出码,所以要把它们都列出来实在是太长了……!

关于11错误代码,它确实是分段错误编号,主要意味着程序访问了一个没有分配的内存位置。

第1部分:高级Bash脚本编写指南

像往常一样,高级Bash脚本编写指南有很多信息: (这个链接在另一个答案中,但指向一个非规范的URL。)

1:捕捉一般错误 2:误用shell内置程序(根据Bash文档) 126:调用的命令无法执行 127: "命令未找到" 128:退出的无效参数 128+n:致命错误信号“n” 255:退出状态超出范围(退出只接受0 - 255范围内的整数参数)

第2部分:sysexits.h

ABSG引用sysexits.h。

在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 */

返回码的8位和终止信号的8位数字被混合成从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" */
}

你如何决定退出状态?传统上,shell只存储8位返回码,但如果进程异常终止,则设置高位。

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

如果你看到的不是这个,那么程序可能有一个SIGSEGV信号处理程序,然后正常调用exit,所以它实际上没有被信号杀死。(程序可以选择处理除SIGKILL和SIGSTOP之外的任何信号。)

'1':笼统错误

'2':误用shell内置程序(根据Bash文档)

“126”:调用的命令无法执行

'127': "命令未找到"

'128':无效的退出参数

'128+n':致命错误信号"n"

'130':以Ctrl + C结束的脚本

255:超出范围的退出状态

这是给巴斯的。但是,对于其他应用程序,有不同的退出代码。

有些是惯例,但其他一些保留的是POSIX标准的一部分。

126—找到要执行的文件,但它不是可执行实用程序。 127—没有找到要执行的实用程序。 >128—命令被信号中断。

参见man 1p退出的基本原理部分。