Problem
Chciałbym zabić proces o nazwie raspivid (program, który nagrywa filmy za pomocą aparatu Raspberry Pi), ale nie mogę ...
Tak to nazywam:
#!/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 $$
Jeśli szukam tego procesu, nadal tam jest:
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
Jeśli spróbuję go zabić, to nie umrze. Zamiast tego zmienia nadrzędny PID na 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
Obserwacje:
- Połączenie działa przez chwilę dobrze (2 godziny lub coś), a następnie zaczyna się zawieszać.
- Tylko fizyczne wyłączenie zasilania rozwiązuje problem. Nie mogę zrestartować się przez terminal (również się zawiesza)
Moje pytania:
- Dlaczego Linux przypisuje nadrzędny PID do 1?
- Dlaczego proces nie może zostać zabity? (Próbowałem też
sudo kill -9 7238
)
killall
najwyraźniej zabija rodzica, a nie proces, który chciał.<defunct>
w jegops
dorobku? Co to ma wspólnego z tym pytaniem?$!
onkill -9
nie czekając na proces tła z kamerą ... posleep 16
onkill -9
do rodziców , nagle znowu. Pachniało .zombie ... Idąc za zapachem (:-)) widać, że pops -ef
tym, co zrobił, dziecko wciąż żyje, ale rodzic został zabity (-9).kill -9
swój własny proces. Rozsądne jest założenie, że został zabity i <nieistniejący> ... jeszcze bardziej po nieskutecznym połączeniusudo killall raspivid
. Możliwe jest nawet, żeraspivid
spawnują własne procesy potomne, które pozostają osierocone. BTW wystarczy zrobić „ps -aux | grep Z”, aby zobaczyć, czy jest to zombie, czy nie, i powinno (wystarczająco), aby uniknąćkill -9
procesu w głównym skrypcie.Aby odpowiedzieć na pytanie nr 1:
Kiedy proces odradza procesy potomne, każde z nich ma swój własny PID. PPID każdego dziecka (identyfikator procesu rodzica) jest PID ich procesu nadrzędnego. Jeśli rodzic umiera, procesy potomne są osierocone. Osierocone procesy są automatycznie pobierane przez proces inicjowania systemu, który ma PID równy 1.
źródło
Program prawdopodobnie ma otwarte urządzenie kamery, a przez przymusowe zabicie go nie pozwoliłeś mu odpowiednio wyczyścić, więc teraz utknął.
Kilka uwag:
-t 15000
do programu, aby określić długość filmu, więc pierwsze zabójstwo powinno być niepotrzebne. Drugie zabicie jest również niepotrzebne, ponieważ powłoka sama się zakończy, gdy osiągnie koniec skryptu. Jeśli program sam nie wychodzi (tak jak powinien), masz inne problemy.źródło