2013-08-04 179 views
1

我有一個單線程進程,它不會死於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或進程跟蹤不成問題。

+0

您是否嘗試附加strace或gdb以查看userland backtrace? – OznOg

回答

0

您確定SIGTERM在您的系統上是信號15嗎?您沒有在問題中指定操作系統或體系結構,但很可能您可以使用「kill -l」列出信號(小寫字母L,不是數字1)。如果你對這個過程進行調整,那麼會發生什麼情況,然後殺死-TERM呢?例如:

strace -Tttf -o strace.out -p 5105 & 
kill -TERM 5105 

信號掩模是否在變化? strace也應該顯示這是否發生。