2011-12-16 15 views
18

Qualcuno mi ha detto che quando hai ucciso un processo genitore in linux, il bambino sarebbe morto.
Ma ne dubito. Così ho scritto due script bash, dove father.sh invocherebbe child.shPerché il processo figlio è ancora in vita dopo che il processo genitore è stato ucciso in Linux?

Ecco il mio script:

enter image description here

Ora corro bash father.sh, si potrebbe verificare che ps -alf enter image description here

Poi ho ucciso il father.sh di kill -9 24588, e ho indovinato che il processo figlio dovrebbe essere terminato, ma sfortunatamente mi sono sbagliato. enter image description here

Qualcuno potrebbe spiegare perché?

thx

+5

Penso che potresti tagliare l'80% del testo e tutte le immagini e mantenere comunque tutto ciò che conta in questa domanda. – ndemou

risposta

26

No, quando si uccide un processo da solo, esso non uccidere i bambini.

è necessario inviare il segnale al gruppo processo se si desidera che tutti i processi per un determinato gruppo per ricevere il segnale

kill -9 -parentpid 

In caso contrario, gli orfani saranno collegati al init, come mostrato dal terzo screenshot (PPID del bambino è diventato 1).

+0

Dove 'thepidhere' è di solito il PID del processo genitore, ma può essere rilevato con certezza usando' ps -eo "% p% r% c% a" '. +1. –

+0

L'ID del gruppo di processi è uguale all'ID genitore. Puoi dare maggiori dettagli su come fermarli tutti –

+13

Giusto per chiarire il comando di fge nel caso in cui non sia ovvio, stai passando l'id genitore come numero negativo, ad es. se il pid genitore è 1234, si desidera uccidere -1234 – frankc

4

-bash: uccidere: (-123) - Nessuna tale processo

In una sessione interattiva Terminal.app gruppo processo in primo piano e il numero ID processo in background numero del gruppo id sono diversi in base alla progettazione quando il lavoro la modalità controllo/monitor è abilitata. In altre parole, se si esegue lo sfondo di un comando in una sessione Terminal.app abilitata per il controllo processi, il pid $! del processo in background è in realtà un nuovo numero ID del gruppo processo (pgid).

In uno script che non ha abilitato il controllo del processo, tuttavia, questo potrebbe non essere il caso! Il pid del processo in background potrebbe non essere un nuovo pgid ma un normale pid! E questo è, ciò che causa il messaggio di errore -bash: kill: (-123) - No such process, cercando di uccidere un gruppo di processi ma specificando solo un normale pid (invece di un pgid) al comando kill.

# the following code works in Terminal.app because $! == $pgid 
{ 
sleep 100 & 
IFS=" " read -r pgid <<EOF 
$(ps -p $! -o pgid=) 
EOF 
echo $$ $! $pgid 
sleep 10 
kill -HUP -- -$! 
#kill -HUP -- -${pgid} # use in script 
} 
+0

Questo risponde a ** completamente diverso ** domanda – ndemou

+0

Ma in realtà ha spiegato il mio problema :) – astrojuanlu

2
pkill -TERM -P <ProcessID> 

Questo ucciderà sia Parent così come bambino

5

Generalmente uccidere il genitore uccide anche il bambino.

La ragione per cui si sta vedendo il bambino ancora vivo dopo aver ucciso il padre è perché il bambino morirà solo dopo aver scelto di gestire l'evento SIGKILL. Non deve occuparsene subito. Lo script sta eseguendo un comando sleep(), che non si sveglierà per gestire alcun evento fino al completamento del sonno.

Perché il PPID # 1? Il genitore è morto e non è più nella tabella del processo. child.sh non è collegato inspiegabilmente per inizializzare ora. Semplicemente non ha un genitore in esecuzione.Dicendo che è collegato a init crea l'impressione che se in qualche modo lasciamo init, quell'iniziale ha il controllo sull'arresto del processo. Crea anche l'impressione che uccidere un genitore renderà il nonno il proprietario di un bambino. Entrambi non sono vere. Quel processo figlio esiste ancora nella tabella del processo ed è in esecuzione, ma nessun nuovo evento basato sul suo ID processo sarà gestito fino a quando non gestirà SIGKILL. Il che significa che il bambino è un pre-zombi, che cammina morto, rischia di essere etichettato.

Uccidere nel gruppo processo è diverso, ed è usato per uccidere i fratelli , e il genitore dal gruppo processo #. Probabilmente è anche importante notare che "uccidere un processo" non significa "uccidere" di per sé, nel modo umano, dove ci si aspetta che il processo venga distrutto e tutta la memoria sia tornata come se non fosse mai stata. Invia semplicemente un evento particolare, tra molti, al processo che deve gestire. Se il processo non lo gestisce correttamente, dopo un po 'il sistema operativo arriverà e "pulirà" con forza.

It (uccisione) non avviene immediatamente perché il bambino (o anche il genitore) potrebbe aver scritto qualcosa sul disco e attendere l'I/O per completare o eseguire qualche altra attività critica che potrebbe compromettere la stabilità del sistema o integrità del file.

+0

Beracah, sembra che tu abbia appena confabulato la tua intera risposta. La risposta accettata è corretta e vi lascio con questo link: http://man7.org/linux/man-pages/man7/signal.7.html e citare "I segnali SIGKILL e SIGSTOP non possono essere catturati, bloccati o ignorati ". – ALL

+0

Non corretto di nuovo. TUTTI, chiaramente non sai cosa significa questa citazione. Ti illuminerò, dato che apparentemente leggi solo le pagine man di Linux, come se Linux fosse l'origine della segnalazione UNIX. Il processo non OTTIENE L'OPZIONE di fare qualsiasi cosa con SIGKILL e SIGSTOP. Il processo è ancora in agguato perché il KERNEL, attualmente sta gestendo l'I/O o altro codice del driver di base per conto del processo. Quel codice non è tornato e il processo è bloccato. Non è in uno stato RUN. Non ha la possibilità di fare nulla con quegli eventi. Non solo inoltrare pagine di uomini come il Vangelo. – Beracah

Problemi correlati