Linux에서이 프로세스를 종료 할 수없는 이유는 무엇입니까?


8

문제

raspivid (Raspberry Pi Camera를 사용하여 비디오를 녹화하는 프로그램)라는 프로세스를 종료하고 싶지만 ...

이것이 내가 부르는 방법입니다.

#!/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)

답변:


2

문제

당신의 스크립트는 아마도 당신의 명령 때문에 좀비를 만들고있을 것입니다 kill -9; jjlin의 대답 에서 제안 했듯이 강제하지 않고 프로세스를 갑자기 죽이는 것은 좋은 습관이 아닙니다.

에서 man bash우리가 읽을 수 있습니다 :

<defunct>로 표시된 프로세스는 부모가 프로세스를 제대로 파괴하지 않았기 때문에 남아 있는 죽은 프로세스 (소위 " 좀비 ")입니다 . 이러한 프로세스 부모 프로세스가 종료되면 init (8)에 의해 파괴 됩니다.

답변 # 1 : 프로세스 initPID 1 이 있고이 Linux에서는 PID 1로 부모를 할당합니다 ( init에 할당하기 때문에 ).

답변 # 2 : 그들은 단지 죽었 기 때문에 단순히 죽일 수 없습니다. 부모님이 아마도 시간을 충분히 기다리면 충분합니다.init

시스템에서 좀비를 제거하기 위해 kill 명령을 사용하여 SIGCHLD 신호를 부모에게 수동으로 보낼 수 있습니다. 부모 프로세스가 여전히 좀비를 거두지 않으면 다음 단계는 부모 프로세스를 제거하는 것입니다. 프로세스가 부모를 잃으면 init는 새로운 부모가됩니다. Init은 주기적으로 대기 시스템 호출을 실행하여 init를 부모로하여 모든 좀비를 거둔다. [1]

이 아이디어가 언젠가 발생하는 경우를 대비 하여 루트 권한 으로 #kill -9 init처리하는 것은 전력망에서 컴퓨터를 물리적으로 분리하는 것과 동등한 소프트웨어입니다. [:-)]

그러나 STAT 열에 "Z"가 있으면 명령 출력에서 좀비 프로세스 를 식별 할 수 있습니다 . 다음 줄을 사용하여 쉽게 식별 할 수 있습니다.ps

ps -aux | grep Z

리눅스 좀비 세계 에 대한 참고 문헌 :


상위 PID 1이있는 프로세스는 좀비가 아닙니다. 프로세스는 부모 가 죽기 전에이 부모를 얻습니다 . 그래서 그의 killall부모가 원하는 과정이 아니라 부모를 죽이고있는 것 같습니다.
Barmar

<defunct>그의 ps결과물 은 어디 에서 보 입니까? 이 질문과 어떤 관련이 있습니까?
Barmar

@Barmar는 보지 못했습니다. 불행히도 항상 문제가 바로 당신이 찾고있는 곳은 아닙니다 . BTW로부터 $!그가 kill -9후 ... 카메라로 백그라운드 프로세스를 기다리지 않고 sleep 16그는 부모를 갑자기 다시. .zombie 냄새가 났다 ... 냄새 (:-) 다음에 그가 한 것처럼 아이가 여전히 살아 있지만 부모가 죽었다는 것을 알 수 있습니다 (-9). kill -9ps -ef
Hastur

1
고아 프로세스와 좀비 프로세스를 혼동하고 있다고 생각하지만 관련이 없습니다.
Barmar

스크립트를 다시 살펴보면 kill -9자신의 프로세스입니다. 유효하지 않은 호출 후에 더 많이 죽이고 <defunct> ...라고 가정하는 것이 합리적 sudo killall raspivid입니다. raspivid고아로 남아있는 자체 자식 프로세스를 생성하는 것도 가능 합니다. BTW 좀비 인지 아닌지 를 확인하기 위해 "ps -aux | grep Z"를 수행하는 것으로 충분 kill -9하며, 메인 스크립트의 프로세스 를 피하기에 충분해야합니다 .
Hastur

4

질문 번호 1에 답하려면 :

프로세스가 자식 프로세스를 생성 할 때 자식은 각각 고유 한 PID를 갖습니다. 각 자식 (부모의 프로세스 ID)의 PPID는 부모 프로세스의 PID입니다. 부모가 죽으면 자식 프로세스가 분리됩니다. 고아 프로세스는 PID가 1 인 시스템 초기화 프로세스에 의해 자동으로 선택됩니다.


0

프로그램에 카메라 장치가 열려있을 수 있으며 강제로 종료하면 제대로 정리할 수 없으므로 이제 막혔습니다.

몇 가지 관찰 :

  • 일반적으로 수행중인 작업을 모르는 경우 -9로 시작하여 프로그램을 종료하는 것은 좋지 않습니다. 옵션없이 정상적인 킬만해도됩니다.
  • 스크립트에서 살인을 전혀 할 필요가 없습니다. -t 15000비디오 길이를 지정하기 위해 이미 프로그램에 전달 되었으므로 첫 번째 킬은 불필요합니다. 쉘이 스크립트의 끝에 도달하면 자체적으로 종료되므로 두 번째 종료도 필요하지 않습니다. 프로그램이 자체적으로 종료되지 않으면 다른 문제가있는 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.