在 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 . &
它的状态是Sl
,S
表示“可中断睡眠(等待事件完成)”并且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/status
、SigBlk
和找到后两者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 是否在那里。