8

проблема

Я хотел бы убить процесс под названием 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

Замечания:

  1. Звонок работает нормально некоторое время (2 часа или около того), затем начинает зависать.
  2. Только физическое отключение решает проблему. Не могу перезагрузиться через терминал (тоже зависает)

Мои вопросы:

  1. Почему Linux назначает родительский PID 1?
  2. Почему процесс не может быть убит? (Я также пытался sudo kill -9 7238)

3 ответа3

4

Чтобы ответить на вопрос № 1:

Когда процесс порождает дочерние процессы, каждый из них имеет свой собственный PID. PPID каждого дочернего элемента (идентификатор процесса родителя) является PID их родительского процесса. Если родитель умирает, то дочерние процессы становятся сиротами. Потерянные процессы автоматически выбираются процессом инициализации системы, у которого PID равен 1.

2

проблема

Ваш скрипт, вероятно, создает зомби из-за ваших команд kill -9 ; Как подсказывает jjlin, ответ тоже никогда не является хорошей практикой, чтобы внезапно завершить какой-либо процесс без принуждения.

Из man bash мы можем прочитать:

Процессы, помеченные как <defunct>, - это мертвые процессы (так называемые « зомби »), которые остаются, потому что их родитель не уничтожил их должным образом. Эти процессы будут уничтожены init (8), если родительский процесс завершится.

Ответ № 1: процесс init имеет PID 1, и для этого Linux назначает ему родителя с PID 1 (потому что он назначает их для init).

Ответ № 2: Их нельзя убить просто потому, что они просто мертвы... если их родитель init вероятно, достаточно подождать некоторое время.

Чтобы удалить зомби из системы, сигнал SIGCHLD можно отправить родителю вручную, используя команду kill. Если родительский процесс по-прежнему отказывается пожинать зомби, следующим шагом будет удаление родительского процесса. Когда процесс теряет своего родителя, init становится его новым родителем. Init периодически выполняет системный вызов wait, чтобы пожинать зомби с init в качестве родителя. [1]

На тот случай, если однажды возникнет эта идея: #kill -9 init Процесс инициализации с привилегиями root является программным эквивалентом физического отключения компьютера от электросети. [:-)]

Однако зомби-процессы могут быть идентифицированы в выходных данных команды ps по наличию "Z" в столбце STAT . Вы можете использовать следующую строку, чтобы легко идентифицировать их

ps -aux | grep Z

Некоторые ссылки о мире Linux-зомби:

0

Программа, вероятно, имеет открытое устройство камеры, и, принудительно убив его, вы не позволили ему очиститься должным образом, поэтому теперь оно зависло.

Несколько замечаний:

  • Обычно не стоит убивать программу, начиная с -9, если вы не знаете, что делаете. Просто нормальное убийство (без вариантов) это нормально.
  • Там не должно быть необходимости делать какие-либо убийства в вашем сценарии вообще. Вы уже передали -t 15000 в программу, чтобы указать длину видео, поэтому первое уничтожение должно быть ненужным. Второе уничтожение также не требуется, поскольку оболочка завершит работу самостоятельно, когда достигнет конца сценария. Если программа не выходит сама по себе (как и должно быть), то у вас есть другие проблемы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .