GNU/Linux >> Znalost Linux >  >> Linux

Proces Linuxu na pozadí - Zastaveno v úlohách?

Z toho, co mohu shromáždit.

Úlohám na pozadí je blokováno čtení terminálu uživatele. Když se o to někdo pokusí, bude pozastaven, dokud jej uživatel nepřenese do popředí a neposkytne nějaký vstup. "čtení z terminálu uživatele" může znamenat buď přímý pokus o čtení z terminálu, nebo změnu nastavení terminálu.

Normálně to je to, co chcete, ale někdy programy čtou z terminálu a/nebo mění nastavení terminálu ne proto, že potřebují uživatelský vstup k pokračování, ale proto, že chtějí zkontrolovat, zda se uživatel pokouší poskytnout vstup.

http://curiousthing.org/sigttin-sigttou-deep-dive-linux má krvavé technické podrobnosti.


V Linuxu a dalších unixových systémech jde o úlohu, která běží na pozadí, ale stále má své stdin (nebo std::cin ) přidruženému k jeho ovládacímu terminálu (aka oknu, ve kterém byl spuštěn), bude odesláno SIGTTIN signál, který ve výchozím nastavení způsobí úplné zastavení programu, dokud jej uživatel nepřenese do popředí (fg %job nebo podobné), aby bylo možné skutečně zadat vstup programu. Chcete-li se vyhnout pozastavení programu tímto způsobem, můžete:

  1. Ujistěte se, že programy stdin kanál již není přidružen k terminálu, a to buď přesměrováním do souboru s vhodným obsahem, který má program vložit, nebo na /dev/null pokud opravdu nepotřebuje vstup - např. myprogram < /dev/null & .
  2. Po spuštění programu ukončete terminál, což způsobí přidružení k programu stdin Jdi pryč. To však způsobí SIGHUP být doručen programu (to znamená, že vstupní/výstupní kanál zaznamenal "zaseknutí") – to obvykle způsobí ukončení programu, ale tomu se lze vyhnout použitím nohup - např. nohup myprogram & .

Pokud máte vůbec zájem o zachycení výstupu programu, je to pravděpodobně nejlepší volba, protože zabrání oběma výše uvedeným signálům (a také několika dalším) a uloží výstup, abyste se mohli podívat, zda existují nějaké problémy s prováděním programů:

nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &

Ano, opravdu je zastaven a na pozadí již nefunguje. Chcete-li jej vrátit k životu, zadejte fg job_number


Linux
  1. Vydejte se na dobrodružství ve svém linuxovém terminálu

  2. Jak spravovat úlohy na pozadí Linuxu pomocí příkazů fg a bg

  3. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  1. Linux – příkaz ke spuštění podřízeného procesu „offline“ (bez externí sítě) v systému Linux?

  2. Jak zabránit zastavení procesu na pozadí po zavření klienta SSH v Linuxu

  3. Jak získat ID procesu na pozadí?

  1. Jak spustit příkaz Linux na pozadí a odpojit proces v terminálu

  2. Proces běžící na pozadí byl v linuxu zabit

  3. Udržování běžícího linuxového procesu po mém odhlášení