Perché non posso uccidere questo processo su Linux?


8

Problema

Vorrei uccidere un processo chiamato raspivid (programma che registra video usando una fotocamera Raspberry Pi) ma non posso ...

Ecco come lo chiamo:

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

Se cerco questo processo, è ancora lì:

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

Se provo ad ucciderlo, non muore. Invece cambia il PID padre in 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

osservazioni:

  1. La chiamata funziona bene per un po '(2 ore o qualcosa del genere) quindi inizia a bloccarsi.
  2. Solo uno spegnimento fisico risolve il problema. Non riesco a riavviare tramite terminale (si blocca anche)

Le mie domande:

  1. Perché Linux assegna il PID padre a 1?
  2. Perché il processo non può essere ucciso? (Ho anche provato sudo kill -9 7238)

Risposte:


2

Problema

La tua sceneggiatura probabilmente sta creando zombie a causa dei tuoi kill -9comandi; come suggerito anche dalla risposta di Jjlin, non è mai una buona pratica uccidere bruscamente qualche processo senza essere costretto a farlo.

Da man bashpossiamo leggere:

I processi contrassegnati come <defunti> sono processi morti (i cosiddetti " zombi ") che rimangono perché il loro genitore non li ha distrutti correttamente . Questi processi verranno distrutti da init (8) se termina il processo padre.

Risposta n. 1: il processo init ha il PID 1 e per questo Linux assegna loro il genitore con il PID 1 (perché li assegna a init ).

Risposta n. 2: non possono essere uccisi semplicemente perché sono solo morti ... se il loro genitore è initprobabilmente abbastanza per aspettare un po 'di tempo.

Per rimuovere gli zombi da un sistema, il segnale SIGCHLD può essere inviato manualmente al genitore, usando il comando kill. Se il processo genitore rifiuta ancora di raccogliere lo zombi, il passo successivo sarebbe rimuovere il processo genitore. Quando un processo perde il suo genitore, init diventa il suo nuovo genitore. Init esegue periodicamente la chiamata di sistema di attesa per raccogliere eventuali zombi con init come genitore. [1]

Nel caso in cui questa idea nasce un giorno o l'altro: a #kill -9 initprocesso con privilegi di root è l'equivalente software fisicamente scollegare il computer dalla rete elettrica. [:-)]

Tuttavia, i processi di zombi possono essere identificati nell'output del pscomando dalla presenza di una "Z" nella colonna STAT . È possibile utilizzare la seguente riga per identificarli facilmente

ps -aux | grep Z

Alcuni riferimenti sul mondo degli zombi di Linux :


Un processo con PID 1 padre non è uno zombi. Un processo ottiene questo genitore quando il suo genitore viene ucciso prima che lo sia. Quindi il suo killallapparentemente sta uccidendo il genitore, non il processo che voleva.
Barmar,

Dove vedi <defunct>nella sua psuscita? Che cosa ha a che fare con questa domanda?
Barmar,

@Barmar non l'ho visto. Sfortunatamente non sempre il problema è esattamente dove stai cercando . A proposito di $!lui kill -9senza aspettare il processo in background con una macchina fotografica ... dopo un sleep 16lui kill -9il genitore , improvvisamente di nuovo. Puzzava di .zombie ... Seguendo l'odore (:-)) puoi vedere che, con le seguenti azionips -ef , il bambino era ancora vivo, ma il genitore è stato ucciso (-9).
Hastur,

1
Penso che tu stia confondendo i processi orfani con i processi di zombi, ma non sono correlati.
Barmar,

Guardando di nuovo la sceneggiatura: ha il kill -9suo stesso processo. È ragionevole supporre che sia stato ucciso e <defunto> ... ancora di più dopo la chiamata non efficace sudo killall raspivid. È anche possibile che raspividgeneri i propri processi figlio che rimangono orfani. A proposito, basta fare "ps -aux | grep Z" per vedere se è zombi o no, e dovrebbe essere (abbastanza) per evitare kill -9il processo nello script principale.
Hastur,

4

Per rispondere alla domanda numero 1:

Quando un processo genera processi figlio, ognuno ha il proprio PID. Il PPID di ciascun figlio (ID processo del genitore) è il PID del processo genitore. Se il genitore muore, i processi figlio sono orfani. I processi orfani vengono automaticamente rilevati dal processo di inizializzazione del sistema che ha un PID di 1.


0

Il programma probabilmente ha aperto il dispositivo della fotocamera e uccidendolo forzatamente, non gli hai permesso di ripulire correttamente, quindi ora è bloccato.

Alcune osservazioni:

  • Generalmente non è una buona idea uccidere un programma iniziando con -9 a meno che tu non sappia cosa stai facendo. Solo una normale uccisione (senza opzioni) va bene.
  • Non ci dovrebbe essere alcuna necessità di fare uccisioni nella tua sceneggiatura. Sei già passato -t 15000al programma per specificare la lunghezza del video, quindi la prima uccisione non dovrebbe essere necessaria. Anche il secondo kill non è necessario poiché la shell uscirà da sola quando raggiunge la fine dello script. Se il programma non esce da solo (come dovrebbe), allora hai altri problemi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.