
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
「マルチスレッド(NPTL pthreadなどのCLONE_THREADを使用)」を意味します。それでは、なぜプロセスを殺すことができないのだろうか。どうやって殺すの?ありがとうございます。
$ 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
同様の目的で使用されると思います。 、およびを見ると、後者の2つを見つけることができます/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があることを確認できるはずです。