为什么我不能终止“Sl”进程?

为什么我不能终止“Sl”进程?

在 Lubuntu 18.04 上,我打开 pcmanfm

$ pcmanfm . 

在查看pcmanfm中当前目录下的图像文件的缩略图后,我通过Alt-F4关闭了pcmanfm的窗口,但它仍然挂在终端模拟器的前台。

我通过 Ctrl-Z 和 将其移至后台bg 2,然后杀死它,但不起作用。

$ jobs -l 
[2]+ 31124 Running                 pcmanfm . &
$ kill %2
$ jobs -l
[2]+ 31124 Running                 pcmanfm . &
$ sudo kill 31124
$ jobs -l
[2]+ 31124 Running                 pcmanfm . &

它的状态是SlS表示“可中断睡眠(等待事件完成)”并且l表示“是多线程的(使用 CLONE_THREAD,如 NPTL pthreads 那样)”。所以我想知道为什么我不能杀死该进程?你会怎样杀死它?谢谢。

$ ps aux | grep [3]1124
t        31124  0.8  0.7 693952 57064 pts/9    Sl   06:34   0:47 pcmanfm 

答案1

默认情况下,kill只发送一个TERM信号,由于某种原因pcmanfm忽略这个信号。如果您通过选项 -KILL 来终止,那么它将向调度程序发送信号,并且进程将被删除,没有机会清理或上诉。

不要需要额外的权限 ( sudo) 来终止您拥有的进程。sudo可能很危险,不要只是出于沮丧而使用。

答案2

Kill 默认发送 SIGTERM。这由进程的信号处理程序处理,并且进程可以:

  • 安装一个不执行任何操作的信号处理程序
  • 忽略一个信号
  • 屏蔽信号(并在解除屏蔽后将其传送)

我想这pcmanfm会起到类似的作用。您可以通过查看/proc/PID/statusSigBlk和找到后两者SigIgn

另一方面,SIGKILL (9) 不由进程本身处理,并且不能更改、忽略或屏蔽其信号处理程序。

尝试针对 pid 运行这个 python3 程序,pcmanfn看看它到底忽略或阻止了什么(需要 python 3.5):

#!/usr/bin/python3

import os
import sys
import time
import signal

def show(label, value):
    ivalue = int(value, 16)
    print("%s: %s:"% (label, value.strip()), end=' ')
    cnt=1
    while ivalue:
        if ivalue & 1:
            print("%s(%s)" % (signal.Signals(cnt).name, cnt), end=' ')
        ivalue>>=1
        cnt+=1
    print()

if len(sys.argv)==1:
    pid=os.getpid()
else:
    pid=int(sys.argv[1])

status=open('/proc/%d/status' % (pid,)).readlines()
print("Pid: %d" % (pid,))
for line in status:
    what, value = line.split(':', 1)
    if what=='SigBlk':
        show('Blocked', value)
    elif what=='SigIgn':
        show('Ignored', value)

您应该能够看到 SIGTERM 是否在那里。

相关内容