【发布时间】:2015-06-13 09:45:45
【问题描述】:
如果我执行以下命令,所有进程都将被杀死并且帐户 已注销。
命令:
kill -9 -1
类似于注销命令。在 Unix 中,没有 pid 为“-1”的进程。那么,造成这种结果的原因是什么?
【问题讨论】:
标签: linux bash shell unix ubuntu
如果我执行以下命令,所有进程都将被杀死并且帐户 已注销。
命令:
kill -9 -1
类似于注销命令。在 Unix 中,没有 pid 为“-1”的进程。那么,造成这种结果的原因是什么?
【问题讨论】:
标签: linux bash shell unix ubuntu
查看手册页 (http://linux.die.net/man/2/kill)
如果 pid 等于 -1,则 sig 被发送到每个进程 调用进程有权限发送信号,除了进程1 (init),但见下文。
所以我猜那是你脱离了系统 - 但我们其他人的生活仍在继续
PS:不优雅
【讨论】:
当kill 的pid 参数以- 为前缀时,它会将信号发送到进程组。每个进程都有一个 pid,但也有一个进程组 id。
你可以通过运行这个来看到这个:
$ bash -c 'sleep 10 & sleep 1; ps -o pid,ppid,pgrp,cmd'
PID PPID PGRP CMD
22471 22467 22471 -bash
22496 22471 22496 bash -c sleep 10 & sleep 1; ps -o pid,ppid,pgrp,cmd
22497 22496 22496 sleep 10
22499 22496 22496 ps -o pid,ppid,pgrp,cmd
这里你可以看到bash -c已经有了自己的进程组(22496,和它的PID一样),它的两个子进程(sleep和ps)都继承了这个进程组。
kill -TERM 22496 会向 pid 为 22496 的bash -c 进程发送一个 TERM 信号,而kill -TERM -22496 会向bash -c、sleep 和ps 三个进程发送一个TERM 信号。
-1 但是,这是一种特殊情况,它将信号发送到您可以发送到的所有进程。
【讨论】:
kill -9 -1 消除了硬重启系统的需要,主要用于有效和干净地终止没有响应的程序。
【讨论】:
kill -9 不是结束进程的干净方式。我很苛刻