argle Asked: 2018-02-08 00:33:34 +0800 CST2018-02-08 00:33:34 +0800 CST 2018-02-08 00:33:34 +0800 CST `kill <PID list>` 是否确定了正确的杀戮顺序(或者它是否进行了正确的重试)? 772 有些进程不能在其他进程之前被杀死,所以我可以想到一个例子,kill <PID list>尝试杀死这样一个进程,放弃,然后成功地杀死它的“伙伴”,让前者不被杀死,即使它也可以杀死它,稍后重试。 如果这种情况属实,那么另一个问题是,是否kill <PID list>遵守我列表中 PID 的顺序,或者我是否必须使用单独的终止进程来控制进程被终止的顺序? bash kill 3 个回答 Voted Best Answer ilkkachu 2018-02-08T02:27:53+08:002018-02-08T02:27:53+08:00 我怀疑除了依次向每个目标发送信号之外还有什么。的 POSIX 定义kill(1)就是这样,所以重试似乎违反了规范: kill实用程序应向每个pid操作数指定的一个或多个进程发送一个信号。 对于每个pid操作数,kill实用程序应执行与kill () 函数等效的操作 另外,请记住,并非所有信号都会导致进程终止,有些类似SIGHUP(更不用说SIGUSR1)可能对不同的程序意味着不同的事情。没有明确的方法kill可以知道何时重试,但肯定存在首先发送SIGTERM然后“重试”的程序SIGKILL。 按照给定的顺序发送信号将是简单的实现,这就是例如 Bashkill所做的: $ strace -etrace=kill bash -c 'kill -0 33330 33339 33335 33332 33337' |& grep ^'kill(' kill(33330, SIG_0) = -1 ESRCH (No such process) kill(33339, SIG_0) = -1 ESRCH (No such process) kill(33335, SIG_0) = -1 ESRCH (No such process) kill(33332, SIG_0) = -1 ESRCH (No such process) kill(33337, SIG_0) = -1 ESRCH (No such process) dr_ 2018-02-08T00:54:49+08:002018-02-08T00:54:49+08:00 kill <PID list>只需将指定的信号发送到指定的进程列表。然后,您的系统的行为取决于该特定进程是否忽略该特定信号。默认情况下,kill发送一个 TERM 信号。 假设您在这里谈论 SIGKILL,则无法阻止或忽略此信号。所以kill -9将杀死列出的进程,除非由于某种原因进程没有响应(例如,在阻塞的 NFS 上等待 I/O)。 Neurootic 2018-02-08T02:39:58+08:002018-02-08T02:39:58+08:00 我们可以通过简单地查看kill.c来回答这个问题。 基本上我们只是: 使用 struct proc_processes ps = proc_open_processes()列出所有进程; 然后我们按 pid 或进程名称过滤该列表并发送 kill_verbose(&ctl) 到每个找到的进程,这只是简单的 kill(ctl->pid, ctl->numsig) 当进程被 SIGKILL 杀死时,它被终止。来自signal.h: terminate - kill the process, i.e. all threads in the group, similar to exit_group. The group leader (only) reports WIFSIGNALED status to its parent. 如您所见,这只是简单的“向进程发送消息”命令。没有什么花哨。
我怀疑除了依次向每个目标发送信号之外还有什么。的 POSIX 定义
kill(1)
就是这样,所以重试似乎违反了规范:另外,请记住,并非所有信号都会导致进程终止,有些类似
SIGHUP
(更不用说SIGUSR1
)可能对不同的程序意味着不同的事情。没有明确的方法kill
可以知道何时重试,但肯定存在首先发送SIGTERM
然后“重试”的程序SIGKILL
。按照给定的顺序发送信号将是简单的实现,这就是例如 Bash
kill
所做的:kill <PID list>
只需将指定的信号发送到指定的进程列表。然后,您的系统的行为取决于该特定进程是否忽略该特定信号。默认情况下,kill
发送一个 TERM 信号。假设您在这里谈论 SIGKILL,则无法阻止或忽略此信号。所以
kill -9
将杀死列出的进程,除非由于某种原因进程没有响应(例如,在阻塞的 NFS 上等待 I/O)。我们可以通过简单地查看kill.c来回答这个问题。
基本上我们只是:
使用 struct proc_processes ps = proc_open_processes()列出所有进程; 然后我们按 pid 或进程名称过滤该列表并发送
kill_verbose(&ctl) 到每个找到的进程,这只是简单的 kill(ctl->pid, ctl->numsig)
当进程被 SIGKILL 杀死时,它被终止。来自signal.h:
如您所见,这只是简单的“向进程发送消息”命令。没有什么花哨。