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