nohup
zachytí signál zavěšení (viz man 7 signal
), zatímco ampersand ne (kromě toho, že je shell takto nakonfigurován nebo neodesílá SIGHUP
vůbec).
Obvykle při spuštění příkazu pomocí &
a po opuštění shellu shell ukončí dílčí příkaz signálem hangup (kill -SIGHUP <pid>
). Tomu lze zabránit pomocí nohup
, protože zachytí signál a ignoruje ho, takže nikdy nedosáhne skutečné aplikace.
V případě, že používáte bash, můžete použít příkaz shopt | grep hupon
abyste zjistili, zda váš shell posílá SIGHUP svým podřízeným procesům nebo ne. Pokud je vypnutá, procesy se neukončí, jak se zdá ve vašem případě. Více informací o tom, jak bash ukončuje aplikace, naleznete zde.
Existují případy, kdy nohup
nefunguje, například když proces, který spustíte, znovu připojí SIGHUP
signál, jako je tomu v tomto případě.
myprocess.out &
spustí proces na pozadí pomocí subshell. Pokud je aktuální shell ukončen (řekněme odhlášením), všechny podshelly jsou také ukončeny, takže by byl ukončen i proces na pozadí. Příkaz nohup ignoruje HUP
signál a tedy i když je aktuální shell ukončen, subshell a myprocess.out
bude nadále běžet na pozadí. Dalším rozdílem je, že &
sám o sobě nepřesměruje stdout/stderr, takže pokud dojde k nějakému výstupu nebo chybě, zobrazí se na terminálu. nohup na druhou stranu přesměruje stdout/stderr na nohup.out
nebo $HOME/nohup.out
.
Většinu času se přihlašujeme ke vzdálenému serveru pomocí ssh. Pokud spustíte skript shellu a odhlásíte se, proces je ukončen. Nohup pomáhá pokračovat ve spouštění skriptu na pozadí i po odhlášení ze shellu.
Nohup command name &
eg: nohup sh script.sh &
Nohup zachytí signály HUP. Nohup nedává úlohu automaticky do pozadí. Musíme to říct explicitně pomocí &