为什么 `sudo pkill -HUP -f "nginx: master process"` 返回代码 129 并且没有输出

为什么 `sudo pkill -HUP -f "nginx: master process"` 返回代码 129 并且没有输出

pkill我正在尝试使用和来触发 Nginx 主进程的重新加载sudo

服务器重新加载正常,但我只是好奇是否有人知道为什么该命令sudo pkill -HUP -f "nginx: master process"返回代码 129?

# Running as root
$ pkill -HUP -f "nginx: master process"
$ echo $?

# Output is as expected:
0

# Running as a user (sudo is set to not prompt for a password)
% sudo pkill -HUP -f "nginx: master process
% echo $?

# Output is weird (considering sudo should be passing along the return
#                  code of the command it is executing):
129

在 EC2 上运行的 Ubuntu 12.04.1 LTS 上运行...令人惊讶的是,在物理计算机(未使用云映像安装)上运行的 Ubuntu 12.04.1 LTS 运行良好。

答案1

通常,当 shell 返回高于 128 的状态码时,意味着进程被信号杀死。减去 128 即可得到信号编号。您的 Kill 命令被信号 1(即 HUP)终止。

pkill小心不要自杀。但它与它的父进程(sudo进程)相匹配。

有几种方法可以避免这种情况:

  • 用于pkill -x仅考虑精确匹配而不考虑子字符串(如果可能的话推荐,这是避免虚假匹配的最佳方法)。
  • 不要使用该-f选项。
  • (最后的手段)编写一个与自身不匹配的模式,例如"[n]ginx: master process"

答案2

sudo返回 129,因为pkill正在将 HUP 信号发送到sudo。这是因为的命令行与sudo您提供给 的字符串相匹配。由信号终止的进程以代码 128 + 信号号退出。 HUP 是信号号 1,因此退出代码为 129。pkill-f

相关内容