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

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

我有一个进程现在多次停止响应并且似乎完全锁定。它不会响应任何 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,看看是否有任何区别。

答案1

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

有点残酷,但你可以尝试杀人等级制度应用程序的:kill -15 -$YourRedisPID.这-PID 之前的意思是“PID 及其子进程”。由于它似乎正在等待子进程终止,因此它可能会解锁它。

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

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

SigQ:   8/62777
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180004023

根据内核源代码“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

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

相关内容