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