왜 이 프로세스를 종료할 수 없나요?

왜 이 프로세스를 종료할 수 없나요?

질문

raspivid(라즈베리파이 카메라를 이용해 영상을 녹화하는 프로그램)라는 프로세스를 종료하고 싶은데, 안되더라구요...

나는 이것을 이렇게 부른다:

#!/bin/bash

#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &

#Waiting the video to be complete
sleep 16

#Killing child process
sudo kill -9 $!

#Killing parent process
sudo kill -9 $$

이 프로세스를 검색해도 여전히 존재합니다.

pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     7234  0 21:53 ?        00:00:00 [raspivid]
pi       17096 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid

죽이려고 해도 안 죽는다. 대신 상위 PID를 1로 변경합니다.

pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     1  0 21:53 ?        00:00:00 [raspivid]
pi       17196 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid

관찰 결과:

  1. 통화는 한동안(2시간 정도) 잘 작동되다가 중단되기 시작했습니다.
  2. 물리적으로 전원을 꺼야만 문제가 해결됩니다. 터미널을 통해 재부팅할 수 없습니다(또한 정지됨).

내 질문:

  1. Linux가 상위 PID를 1로 할당하는 이유는 무엇입니까?
  2. 프로세스를 종료할 수 없는 이유는 무엇입니까? (저도 이것을 시도했습니다 sudo kill -9 7238)

편집하다:

아이콜리가 옳습니다. S열에는 D가 표시됩니다.

0 D     0 11823 11819  0  80   0 -     0 down   ?        00:00:00 raspivid

답변1

ps -el실행 대신 실행하면 프로세스 상태가 포함된 열이 ps -ef표시됩니다 . S내 생각엔 프로세스가 상태에 있는 것 같습니다 D. 즉, 중단 없이 기다리는 것을 의미합니다.

즉, 프로세스가 장치 드라이버의 지저분한 부분에 갇혀 있고 커널은 장치 드라이버가 프로세스를 해제하기 전에 프로세스를 종료하는 것이 안전하지 않다고 생각합니다. 문제가 있는 NFS 서버나 결함이 있는 장치와 통신하는 프로세스에서 이 현상이 나타나는 경우가 있습니다. 이 경우에는 비디오 캡처 장치와 통신하는 것처럼 보입니다.

불행하게도 시스템을 재부팅하는 것 외에 D-wait에서 프로세스를 해제할 수 있는 마법의 총알은 없습니다. truss프로그램이 중단되기 전에 무엇을 하고 있었는지 알아내기 위해 Solaris 명령을 사용할 수 있지만 아마도 이에 대해 할 수 있는 일은 아무것도 없을 것입니다. 장치 드라이버에 결함이 있을 수 있습니다.

마지막으로 상위 프로세스 pid가 변경된 이유는 상위 프로세스를 성공적으로 종료했기 1때문입니다 . killall프로세스가 종료될 때마다 해당 하위 프로세스는 pid 1에 의해 상속됩니다. 상위 프로세스의 행이 .pid와 일치하지 않는 이유는 ps -f약간 미스터리입니다 grep.

관련 정보