postgres 命令的退出代码 130 是什么意思?

sda*_*bet 7 exit postgresql exit-status

尝试使用该/usr/pgsql-9.2/bin/postgres命令启动 PostgreSQL 服务器时,我得到一个退出值代码130.

但是,我找不到有关此命令退出代码的任何文档。什么130意思?

仅供参考,该命令是从 Java 代码执行的,该代码基本上如下所示:

Process dbProcess = Runtime.getRuntime().exec(cmd);
...
int exitCode = dbProcess.exitValue();
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 11

至少在 Linux 和 OpenJDK上,返回的值exitValue()与 shell 之类的zshorbash和大多数sh实现(但不是ksh93or yash)分配给其$?变量的值相同。

也就是说,它是:

  • 如果进程以exit(n)return nfrom退出main()n( n & 0xFF)的低 8 位。
  • 如果进程被信号杀死nn + 128

因此,如果您得到 130 的数字,则存在歧义,因为您不知道进程是死于信号 2 还是只是执行了exit(130).

然而,因为如此多的 shell 都遵循 have 的约定128 + signal_number,程序知道避免使用 128 以上的值作为退出代码(或者当他们这样做时exit(130),它会报告一个孩子的死亡,该孩子死于信号 2,就像一些 shell 在某些情况)。

所以在这里,最有可能的是,该进程死于信号 2。您可以通过运行来判断是什么信号:

$ kill -l 130
INT
Run Code Online (Sandbox Code Playgroud)

在 POSIX 风格的 shell 的提示下。

在大多数系统上,信号 2 将是 SIGINT。这是当您在该终端中按 Ctrl-C 时发送到该终端的前台进程组的信号。

$ sleep 10
^C
$ echo "$?"
130
Run Code Online (Sandbox Code Playgroud)

SIGINT 应保留用于终端中断,应用程序不应以其他方式将其发送到其他进程,但没有什么可以阻止它们这样做,因此也有可能在kill(postgres_pid, SIGINT)(kill -s INTkill -INTkill -2在 shell 中) 执行了某些操作。

$ sleep 10 &
[1] 20171
$ kill -s INT "$!"
[1]  + interrupt  sleep 10
$ wait "$!"
$ echo "$?"
130
Run Code Online (Sandbox Code Playgroud)