锁定、忽略 SIGKILL 的进程是可运行的(不是僵尸进程或处于不间断睡眠状态)。它处于什么状态?

ali*_*nth 18 process linux-kernel redis

我有一个进程,现在多次停止响应并且似乎完全锁定。它不会响应任何尝试 strace 或偷看 gdb(gdb 只是挂在 wait4() 系统调用上)。该进程是可运行的,并且不等待系统调用 (/proc/X/syscall:)running或处于不间断睡眠状态 (/proc/X/status:) State: R (running)

这个过程究竟处于什么状态?这可能是某种类型的内核错误吗?

进程是redis,这种情况现在已经发生过几次了。似乎唯一可以终止进程的是重新启动。操作系统是 Cent 7。

编辑:内核版本是 3.10.0-123.13.2.el7.x86_64。尝试更新到 3.10.0-229.11.1.el7 以查看是否有任何区别。

Adr*_* M. 2

wait4 是一个系统调用,指示进程正在等待其子终止之一。这可能表明信号处理存在一些问题。

有点残酷,但您可能会尝试破坏应用程序的层次结构kill -15 -$YourRedisPID: 。PID前面的 -表示“PID 及其子级”。由于它似乎正在等待子进程终止,因此它可能会解锁它。

如果它不起作用,让我们更深入地检查:使用以下命令查找您的信号处理状态grep ^Sig /proc/$YourRedisPID/status

你会看到一些类似的东西:

SigQ:   8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023
Run Code Online (Sandbox Code Playgroud)

根据内核源代码“fs/proc/array.c”中的定义,“SigQ”是待处理信号的数量/待处理信号的限制。

如果信号数量太高,则可能表明您的“SIGKILL”根本没有被处理。我仍在检查“kernel/signal.c”文件以了解这些特殊信号的信号管理。

要直接了解输出,请尝试以下一行: awk 'BEGIN{print "ibase=16;obase=2;"} /^Sig...:/{ print toupper($2)}' /proc/$YourRedisPID/status | BC_LINE_LENGTH=0 bc

这输出我:

0
0
10000000
110000000000000000100000000100011
Run Code Online (Sandbox Code Playgroud)

让我们首先向我们发送这个输出。我会根据需要更新帖子。