проблема
Я хотел бы убить процесс под названием raspivid (программа, которая записывает видео с помощью камеры Raspberry Pi), но я не могу ...
Вот как я это называю:
#!/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
Замечания:
- Звонок работает некоторое время (2 часа или около того), затем начинает зависать.
- Только физическое отключение решает проблему. Не могу перезагрузить через терминал (тоже зависает)
Мои вопросы:
- Почему Linux назначает родительский PID 1?
- Почему процесс не может быть убит? (Я тоже пробовал
sudo kill -9 7238
)
killall
, очевидно, убивает родителя, а не процесс, который он хотел.<defunct>
в егоps
выводе? Какое это имеет отношение к этому вопросу?$!
он ,kill -9
не дожидаясь процесса фона с камерой ... после того, какsleep 16
онkill -9
с родителем , внезапно снова. Пахло .zombie ... После запаха (:-)) вы можете увидеть , что следующийps -ef
он сделал, ребенок еще жив, но родитель был убит (-9).kill -9
свой процесс. Разумно предположить, что он убит и <не функционирует> ... даже больше после неэффективного вызоваsudo killall raspivid
. Возможно даже, чтоraspivid
порождает свои собственные дочерние процессы, которые остаются сиротами. Кстати, достаточно сделать «ps -aux | grep Z», чтобы увидеть, зомби это или нет, и этого должно быть (достаточно), чтобы избежатьkill -9
процесса в основном скрипте.Чтобы ответить на вопрос № 1:
Когда процесс порождает дочерние процессы, каждый из них имеет свой собственный PID. PPID каждого дочернего элемента (идентификатор процесса родителя) является PID их родительского процесса. Если родитель умирает, то дочерние процессы становятся сиротами. Потерянные процессы автоматически выбираются процессом инициализации системы с PID 1.
источник
Программа, вероятно, имеет открытое устройство камеры, и, принудительно убив его, вы не позволили ему очиститься должным образом, поэтому теперь оно зависло.
Несколько замечаний:
-t 15000
в программу, чтобы указать длину видео, поэтому первое удаление должно быть ненужным. Второе уничтожение также не требуется, поскольку оболочка завершит работу самостоятельно, когда достигнет конца сценария. Если программа не выходит сама по себе (как и должно быть), то у вас есть другие проблемы.источник