Чому я не можу вбити цей процес в Linux?


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)

Відповіді:


2

Проблема

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

З цього man bashможна прочитати:

Процеси, позначені <неіснуючі> - це мертві процеси (так звані " зомбі "), які залишаються через те, що їх батько не знищив їх належним чином . Ці процеси будуть знищені за допомогою init (8), якщо вихідний процес буде закритий.

Відповідь №1: Процес init має PID 1, і для цього Linux призначає їм батьків з PID 1 (тому що він призначає їх для init ).

Відповідь №2: Їх не можна вбити просто тому, що вони просто мертві ... якщо їх батька, initмабуть, достатньо, щоб почекати деякий час.

Щоб видалити зомбі з системи, сигнал SIGCHLD може бути відправлений батькові вручну, використовуючи команду kill. Якщо батьківський процес все ж відмовляється від позову зомбі, наступним кроком буде видалення батьківського процесу. Коли процес втрачає свого батьківського, init стає його новим батьківським. Init періодично виконує системний виклик очікування, щоб отримати будь-яких зомбі з init як батьків. [1]

Тільки в разі , якщо ця ідея виникає той чи інший день: в #kill -9 initпроцес з кореневої привілеєм є програмне забезпечення еквівалентно фізично від'єднати комп'ютер від електромережі. [:-)]

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

ps -aux | grep Z

Деякі посилання про Linux зомбі :


Процес з батьківським PID 1 не є зомбі. Процес отримує цього батька, коли його батько вбивається раніше, ніж він є. Тож його killall, мабуть, вбиває батько, а не той процес, якого він хотів.
Бармар

Де ви бачите <defunct>його psвихід? Що це стосується цього питання?
Бармар

@Barmar я не бачив. На жаль, не завжди проблема полягає саме там, де ви шукаєте . До речі, $!він, kill -9не чекаючи фонового процесу з камерою ... після того, як sleep 16він kill -9з батьків , різко знову. Пахло .zombie ... Після запаху (:-)) ви можете побачити , що наступний ps -efвін зробив, дитина ще живий, але батько був убитий (-9).
Гастур

1
Я думаю, що ви плутаєте сирітські процеси з процесами зомбі, але вони не пов'язані між собою.
Бармар

Переглянувши ще раз сценарій: у нього kill -9свій процес. Доцільно припустити, що він убитий та <неіснуючий> ... ще більше після неефективного дзвінка sudo killall raspivid. Можливо навіть, що raspividпороджує власні дочірні процеси, які залишаються сиротами. До речі, достатньо зробити "ps -aux | grep Z", щоб побачити, чи це зомбі чи ні, і слід (достатньо) уникати kill -9процесу в головному сценарії.
Hastur

4

Щоб відповісти на запитання №1:

Коли процес породжує дочірні процеси, у кожного з них є свій PID. PPID кожної дитини (ідентифікатор батьківського процесу) є PID їх батьківського процесу. Якщо батько помирає, то дочірні процеси осиротіли. Осиротілі процеси автоматично підхоплюються системним процесом, який має PID 1.


0

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

Кілька спостережень:

  • Взагалі не вдається вбити програму, починаючи з -9, якщо ви не знаєте, що робите. Просто нормальне вбивство (без варіантів) нормально.
  • У вашому сценарії взагалі не повинно бути ніяких вбивств. Ви вже перейшли -t 15000до програми, щоб вказати довжину відео, тому перше вбивство повинно бути непотрібним. Друге вбивство також непотрібне, оскільки оболонка вийде самостійно, коли досягне кінця сценарію. Якщо програма не виходить самостійно (як слід), у вас є інші проблеми.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.