使用 Kill 发信号时误杀进程的问题

程序里会使用 Kill 发送 SIGTERM 信号,要求某进程组结束:

kill -15 -<pgid>

实际运行时发现一个问题,除了这个目标进程组之外,有时候其他一些进程也会被强行结束。但是,如果在 shell 里执行类似的命令,问题不会出现。

经过反复试验,定位到 Kill 有两个入口:

  • /bin/kill,这是个二进程程序,是 procps 的一部分。在处理上述命令的时候,如果第二个参数是 -1xy.. 的形式,它会解析成 -1,而 -1 表示把信号发给所有的在操作权限范围内的进程。这就是某些用户进程被意外结束的原因。
  • builtin 命令,是 shell 的一部分。研究了 shell 里的 builtin kill 的实现代码,没有这个问题。这是 shell 里无法重现的原因。

定位到了问题,解决就容易了,加个 -- 告诉 getopt 即可:

kill -15 -- -<pgid>

这里是 getopt 的文档说明:

getopt has three ways to deal with options that follow non-options argv elements. The special argument ‘--’ forces in all cases the end of option scanning.

...

Read More: