GNU/Linux >> Znalost Linux >  >> Linux

Proč není Pgid procesů dítěte PGID rodiče?

Takže všude čtu, že tento příkaz by měl ukončit všechny podřízené procesy nadřazeného procesu:

kill -- -$$

Použití negativního ID s příkazem kill odkazuje na PGID a z příkladů, které jsem viděl, se zdá, že PGID podřízených procesů by mělo být PID nadřazeného, ​​ale v mém systému tomu tak není.

V mém systému je PGID potomka stejné jako PGID nadřazeného skriptu, což se ukáže jako bash.

Co se tam děje? Byly příklady špatné nebo je můj systém nastaven jinak?

Potřebuji ukončit podřízené procesy bez ukončení nadřazeného, ​​takže nechci posílat zabíjející signál do PGID, ve kterém je rodič.

Přijatá odpověď:

Když je proces rozvětvený, zdědí své PGID od svého rodiče. PGID se změní, když se proces stane vedoucím skupiny procesu , pak se jeho PGID zkopíruje z jeho PID. Od té doby nový podřízený objekt zpracovává, které se vytvoří, a jejich potomci toto PGID zdědí (pokud nezačnou nové vlastní skupiny procesů).

V prostředí s řízením úloh, jako je většina interaktivních prostředí, je každá úloha umístěna do vlastní skupiny procesů. Pokud spustíte shellový skript, bude shellový proces spouštějící skript vedoucím skupiny a PGID se bude rovnat jeho PID.

V prostředí bez řízení úloh, jako je většina prostředí používaných ke spouštění skriptů, se příkazy spouštějí ve skupině procesů prostředí.

Syntaxe kill -- -N zabije všechny procesy ve skupině s PGID =N. Nemůžete jej použít s libovolným PID, pouze s PID vedoucího skupiny procesů, protože to je PGID. V podstatě takhle vypadá shell

kill %jobid

syntaxe funguje — interně překládá %jobid na PGID úlohy a odešle signál do tohoto PGID.

Neexistuje jednoduchý způsob, jak spustit skript v jeho vlastní skupině procesů z jiného skriptu shellu. Některé návrhy však najdete v části Jak nastavit skupinu procesů skriptu shellu.

Související:Přesunout soubory z více složek do nadřazeného adresáře pomocí příkazového řádku?
Linux
  1. Proč není CD program?

  2. Nový rodičovský proces, když rodičovský proces zemře?

  3. Proč není Sigint propagován do podřízeného procesu, když je odeslán jeho nadřazenému procesu?

  1. Proč je výchozí vidlice mechanismu vytváření procesu?

  2. Jak najít všechny podřízené procesy?

  3. Programově získat nadřazené pid jiného procesu?

  1. Jak nastavím pracovní adresář nadřazeného procesu?

  2. Proč podřízený proces stále žije poté, co byl nadřazený proces v Linuxu zabit?

  3. Jak získat ID procesu pro ukončení procesu nohup?