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:
- 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 &
. - 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ímnohup
- 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