当尝试使用命令启动 PostgreSQL 服务器时,/usr/pgsql-9.2/bin/postgres
我得到的退出值代码为130
。
但是我找不到该命令的退出代码的任何文档。这是什么130
意思?
仅供参考,该命令是从 java 代码执行的,基本上如下所示:
Process dbProcess = Runtime.getRuntime().exec(cmd);
...
int exitCode = dbProcess.exitValue();
答案1
在 Linux 上并使用 OpenJDK至少,返回的值与像or 这样的shell和大多数实现(但不是or )分配给其变量的exitValue()
值相同。zsh
bash
sh
ksh93
yash
$?
也就是说,它是:
- 如果进程以
exit(n)
或return n
从: ( )main()
的低 8 位退出。n
n & 0xFF
- 如果进程被信号杀死
n
:n + 128
。
因此,如果您得到数字 130,则存在歧义,因为您不知道进程是因信号 2 而终止还是只是执行了exit(130)
。
然而,因为很多 shell 都遵循 具有 的约定128 + signal_number
,所以程序知道避免使用高于 128 的值作为退出代码(或者当它们这样做时exit(130)
,它是为了报告一个因信号 2 而死亡的孩子的死亡,就像某些 shell 在某些情况)。
因此,在这里,该进程很可能因信号 2 而死亡。您可以通过运行以下命令来判断该信号是什么:
$ kill -l 130
INT
在 POSIX 风格 shell 的提示符下。
在大多数系统上,信号 2 将为 SIGINT。这是当您在终端中按 Ctrl-C 时发送到终端的前台进程组的信号。
$ sleep 10
^C
$ echo "$?"
130
SIGINT 应该保留用于终端中断,并且应用程序不应将其发送到其他进程,但没有什么可以阻止它们这样做,因此仍然有可能发生了某些事情kill(postgres_pid, SIGINT)
(kill -s INT
或在 shell 中)kill -INT
。kill -2
$ sleep 10 &
[1] 20171
$ kill -s INT "$!"
[1] + interrupt sleep 10
$ wait "$!"
$ echo "$?"
130