"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비슷한 목적으로 사용될 것이라고 생각합니다. , 및 를 보면 후자의 두 개를 찾을 수 있습니다 /proc/PID/status.SigBlkSigIgn

반면 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이 있는지 확인할 수 있어야 합니다.

관련 정보