GNU/Linux >> Linux Esercitazione >  >> Linux

Perché il Pgid dei processi figlio non è il Pid del genitore?

Quindi continuo a leggere ovunque che questo comando dovrebbe terminare tutti i processi figlio del processo padre:

kill -- -$$

L'utilizzo di un ID negativo con il comando kill fa riferimento a un PGID e dagli esempi che ho visto sembra che il PGID dei processi figlio dovrebbe essere il PID del genitore ma non è il caso sul mio sistema.

Sul mio sistema il PGID del figlio è lo stesso del PGID dello script genitore che risulta essere bash.

Cosa sta succedendo qui? Gli esempi erano sbagliati o il mio sistema è configurato in modo diverso?

Quello che devo ottenere è terminare i processi figlio senza terminare il genitore, quindi non voglio inviare un segnale di kill al PGID in cui si trova il genitore.

Risposta accettata:

Quando un processo viene biforcato, eredita il suo PGID dal genitore. Il PGID cambia quando un processo diventa un leader del gruppo di processi , il suo PGID viene copiato dal suo PID. Da quel momento in poi, il nuovo figlio elabora che si genera e i loro discendenti ereditano quel PGID (a meno che non inizino nuovi gruppi di processi propri).

In una shell con controllo del lavoro, come la maggior parte delle shell interattive, ogni lavoro viene inserito nel proprio gruppo di processi. Se esegui uno script di shell, il processo di shell che esegue lo script sarà il leader del gruppo e il PGID sarà uguale al suo PID.

In una shell senza controllo del lavoro, come la maggior parte delle shell utilizzate per eseguire gli script, i comandi vengono eseguiti nel gruppo di processi della shell.

La sintassi kill -- -N uccide tutti i processi nel gruppo con PGID =N. Non puoi usarlo con un PID arbitrario, solo il PID di un leader del gruppo di processi, poiché questo è il PGID. Questo è essenzialmente come funziona la shell

kill %jobid

la sintassi funziona — traduce internamente %jobid al PGID del lavoro e invia il segnale a quel PGID.

Non esiste un modo semplice per eseguire uno script nel proprio gruppo di processi da un altro script di shell. Tuttavia, vedere Come impostare il gruppo di processi di uno script di shell per alcuni suggerimenti.

Correlati:spostare i file da più cartelle nella directory principale con il prompt dei comandi?
Linux
  1. Perché Cd non è un programma?

  2. Nuovo processo genitore quando il processo genitore muore?

  3. Perché Sigint non viene propagato al processo figlio quando viene inviato al processo padre?

  4. Perché il documento Parent Shell Here non funziona per il sottocomando in Dash ma Bash funziona?

  5. Processi UNIX / Linux:funzione C fork()

Perché non installare pacchetti software da Internet

Come inviare processi in background su Linux

Ottieni in modo programmatico il pid genitore di un altro processo?

Perché il processo figlio è ancora vivo dopo che il processo genitore è stato ucciso in Linux?

Come ottenere l'ID del processo per terminare un processo nohup?

Bash:perché lo script genitore non termina su SIGINT quando lo script figlio intercetta SIGINT?