SIGTERM无法终止进程
问题描述:
我有一个单线程进程,它不会死于kill -TERM。信号掩码的过程 不显示SIGTERM被阻止。我正在执行'kill'为 root。我能够使用SIGKILL杀死进程,但这是更大的系统的一部分,我希望SIGTERM能够正常工作。SIGTERM无法终止进程
$ cat /proc/5105/status
Name: task_root.nginx
State: S (sleeping)
Tgid: 5105
Pid: 5105
PPid: 1
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 109 124 1000
VmPeak: 3304480 kB
VmSize: 3304472 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 249060 kB
VmRSS: 320 kB
VmData: 3228468 kB
VmStk: 1012 kB
VmExe: 3020 kB
VmLib: 30232 kB
VmPTE: 1076 kB
VmSwap: 248288 kB
Threads: 1
SigQ: 0/63014
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000004
SigIgn: 0000000000000000
SigCgt: 2000000181001cef
CapInh: 0000000000000000
CapPrm: 0000000000200000
CapEff: 0000000000200000
CapBnd: ffffffffffffffff
Cpus_allowed: ff
Cpus_allowed_list: 0-7
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 16
nonvoluntary_ctxt_switches: 1
请注意Sig *属性。 SigCgt,SigIgn和SigBlk指示SIGTERM既未被捕获,也未被忽略或被阻塞(位#15未被置位 - 将最低有效位计为#1)。由于SIGTERM的默认处置是终止进程,我希望它会被杀死。但是,这不会发生 -
$ sudo kill -TERM 5105
$ cat /proc/5105/status | grep Name
Name: task_root.nginx
过程被挡在等待()系统调用,等待子进程的终止:
$ sudo cat /proc/5105/stack
[<ffffffff8106bfc4>] do_wait+0x1e4/0x260
[<ffffffff8106d230>] sys_wait4+0xa0/0xf0
[<ffffffff81668d02>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
过程是一个单线程程序,这是使用带有标志SIGCHLD |的clone()创建CLONE_NEWPID | CLONE_NEWNS。从父级(默认)PID名称空间来看,PID 5105是*PID。
用SIGKILL杀死进程表明PID或进程跟踪不成问题。
答
您确定SIGTERM在您的系统上是信号15吗?您没有在问题中指定操作系统或体系结构,但很可能您可以使用“kill -l”列出信号(小写字母L,不是数字1)。如果你对这个过程进行调整,那么会发生什么情况,然后杀死-TERM呢?例如:
strace -Tttf -o strace.out -p 5105 &
kill -TERM 5105
信号掩模是否在变化? strace也应该显示这是否发生。
您是否尝试附加strace或gdb以查看userland backtrace? – OznOg