SIGTERM无法终止进程

5

我有一个单线程进程,使用kill -TERM命令无法终止。该进程的信号掩码未阻塞SIGTERM信号。我是以root权限执行'kill'命令。虽然我可以使用SIGKILL杀死该进程,但这只是整个系统的一部分,我希望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位未设置)。由于SIGTERM的默认状态是终止进程,因此我期望它会被杀死。但事实并非如此-
$ sudo kill -TERM 5105

$ cat /proc/5105/status | grep Name
Name:   task_root.nginx

该进程在wait()系统调用中被阻塞,等待子进程的终止:
$ sudo cat /proc/5105/stack
[<ffffffff8106bfc4>] do_wait+0x1e4/0x260
[<ffffffff8106d230>] sys_wait4+0xa0/0xf0
[<ffffffff81668d02>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

这个进程是使用clone()函数创建的单线程进程,采用了SIGCHLD | CLONE_NEWPID | CLONE_NEWNS标志。从父(默认)PID命名空间中查看,PID 5105是顶级PID。

SIGKILL信号可以终止该进程,证明进程跟踪不是问题。


你尝试使用strace或gdb附加进程以查看用户空间回溯吗? - OznOg
1个回答

0
你确定在你的系统上SIGTERM是信号15吗?你没有在问题中指定操作系统或架构,但很可能你可以使用“kill -l”列出信号(这是小写字母L,不是数字1)。如果你strace进程,然后用-TERM杀掉它会发生什么?例如:
strace -Tttf -o strace.out -p 5105 &
kill -TERM 5105

信号掩码是否在改变?strace也应该显示这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接