GNU/Linux >> Znalost Linux >  >> Linux

Co přesně určuje, zda je úloha na pozadí při opuštění shellu zabita nebo zabita?

Proces není "zabit pomocí SIGHUP" - alespoň ne v přísném smyslu slova. Spíše, když je spojení přerušeno, je řídicímu procesu terminálu (v tomto případě Bash) zaslán signál zavěšení*, který se běžně označuje zkratkou "HUP signál" nebo jen SIGHUP.

Nyní, když proces přijme signál, může s ním zacházet, jak chce**. Výchozí pro většinu signálů (včetně HUP) je okamžité ukončení. Program však může signál místo toho ignorovat nebo dokonce spustit nějakou funkci zpracování signálu.

Bash zvolí poslední možnost. Jeho obsluha signálu HUP zkontroluje, zda je volba "huponexit" pravdivá, a pokud ano, odešle SIGHUP každému ze svých podřízených procesů. Teprve po jeho dokončení se Bash ukončí.

Podobně si každý podřízený proces může dělat, co chce, když přijme signál:ponechat jej nastavený na výchozí hodnotu (tj. okamžitě zemřít), ignorovat jej nebo spustit obsluhu signálu.

Nohup pouze změní výchozí akci pro podřízený proces na "ignorovat". Jakmile je však podřízený proces spuštěn, může volně měnit svou vlastní reakci na signál.

To je, myslím, důvod, proč některé programy umírají, i když jste je spouštěli pomocí nohup:

  1. Nohup nastaví výchozí akci na "ignorovat".
  2. Program potřebuje při ukončení provést nějaké vyčištění, takže nainstaluje obslužnou rutinu SIGHUP, která mimochodem přepíše příznak "ignorovat".
  3. Když přijde SIGHUP, obsluha se spustí, vyčistí datové soubory programu (nebo cokoli, co je potřeba udělat) a ukončí program.
  4. Uživatel nezná ani se nezajímá o obslužnou rutinu nebo čištění a pouze vidí, že program byl ukončen i přes nohup.

Zde přichází na scénu „disown“. Proces, který Bash odmítl, nikdy nevyšle signál HUP, bez ohledu na možnost huponexit. Takže i když program nastaví vlastní obslužný program signálu, signál se ve skutečnosti nikdy neodešle, takže obsluha nikdy nespustí. Pamatujte však, že pokud se program pokusí zobrazit nějaký text uživateli, který je odhlášen, způsobí chybu I/O, která by mohla způsobit ukončení programu.

* A ano, než se zeptáte, terminologie "zavěšení" je pozůstatkem z doby vytáčené sítě v UNIXu.

** Každopádně většina signálů. SIGKILL například vždy způsobí okamžité ukončení programu, tečka.


Body 1-4 jsou správné. O bodu 5 nic nevím. Pokud jde o váš poslední bod, skvělá aplikace, obrazovka , vám umožní nechat všechny procesy běžet do jejich přirozeného konce, bez ohledu na to, jak ukončíte připojení. Obrazovka je v repozitáři.

Mužský popis obrazovky není snadno čitelný, ale mimo jiné uvádí:

Když se zavolá obrazovka, vytvoří se jediné okno s shellem (nebo zadaným příkazem) a pak vám uhne z cesty, abyste mohli program používat jako obvykle. Poté můžete kdykoli vytvářet nová okna (na celou obrazovku) s dalšími programy (včetně více shellů), zabíjet stávající okna, zobrazovat seznam oken, zapínat a vypínat protokolování výstupu, kopírovat a vkládat text mezi okna, prohlížet historii rolování, přepínat mezi okny libovolným způsobem atd. Všechna okna spouštějí své programy zcela nezávisle na sobě.Programy pokračují v běhu, když jejich okno aktuálně není vidět, a to i když je celá obrazovka relace je odpojena od terminálu uživatele . Když se program ukončí, obrazovka (ve výchozím nastavení) ukončí okno, které jej obsahovalo. Pokud bylo toto okno v popředí, zobrazení se přepne do předchozího okna; pokud žádné nezůstanou, obrazovka se ukončí.

Zdůraznil jsem nejdůležitější část:okno můžete odpojit příkazem Ctrl+a+d a poté můžete svou relaci zabít/odhlásit a nyní odpojené okno bude nadále žít, přičemž programy uvnitř budou stále spuštěny. Když se připojíte zpět, například zahájením nové relace ssh, příkaz screen -r bude pokračovat v relaci obrazovky, která byla dříve odpojena, se všemi výstupy na standardní chybu/výstup jasně viditelnými.


Linux
  1. Zjistit iniciační systém pomocí Shell?

  2. Co přesně je „zastavení úlohy“, jako v „zastavení úlohy běží…“?

  3. Proč při psaní Ctrl-c v terminálu není úloha v popředí ukončena, dokud není dokončena?

  1. Jaký je význam caddr_t a kdy se používá?

  2. Jaký je rozdíl mezi nohoup a ampersand

  3. Jaký je rozdíl mezi &> a >&v bash?

  1. Co se přesně stane, když spustím soubor v prostředí Shell?

  2. Jak obnovit práci na pozadí z předchozího shellu?

  3. Co je výchozí shell Busybox?