「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 . &

この状態は、「中断可能なスリープモード(イベントが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/statusSigBlkSigIgn

一方、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があることを確認できるはずです。

関連情報