Perché il PGID dei processi di mio figlio non è il PID del genitore?


13

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

kill -- -$$

L'uso 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 bambino è lo stesso del PGID dello script genitore che risulta essere bash.

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

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

Risposte:


11

Penso che intendi PGID, che sta per Process Group ID .

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

In una shell con controllo del lavoro, come la maggior parte delle shell interattive, ogni lavoro viene inserito nel proprio gruppo di processi. Se si esegue 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 -- -Nuccide 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é si tratta del PGID. Questo è essenzialmente come la shell

kill %jobid

la sintassi funziona: si traduce internamente %jobidnel 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. Vedi Come impostare il gruppo di processo di uno script di shell per alcuni suggerimenti, però.


Stai dicendo che una shell con o senza controllo del lavoro fa la stessa cosa?
TCZ8,

1
No. Una shell con controllo dei processi avvia un nuovo gruppo di processi per ciascun processo. Una shell senza controllo del processo non avvia un nuovo gruppo di processi per ciascun processo, ma li esegue nel proprio gruppo di processi.
Barmar,

wow .. non l'ho letto bene la prima volta. Quindi immagino che quello che voglio sia attivare il controllo del lavoro? Ciò garantirebbe che i figli dispongano di un PGID corrispondente al PID dello script principale? O ogni bambino riceverà il proprio PGID unico?
TCZ8,

Ho trovato alcuni documenti online sui controllori dei lavori, ma non ci riesco. Grazie per l'aiuto Barmar.
TCZ8,

1
Con il controllo del lavoro, ogni bambino ottiene il proprio PGID. Senza controllo del lavoro, ereditano il PGID del genitore. Ma il genitore potrebbe aver ereditato il suo PGID dal suo genitore, se non è un leader del gruppo di processi.
Barmar,
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.