Od man nohup
:
Jeśli standardowym wejściem jest terminal, przekieruj go z / dev / null. Jeśli standardowym wyjściem jest terminal, dołącz wyjście, nohup.out
jeśli to możliwe, w $HOME/nohup.out
przeciwnym razie. Jeśli błąd standardowy to terminal, przekieruj go na standardowe wyjście. Aby zapisać dane wyjściowe w PLIKU, użyj nohup COMMAND > FILE
.
(całkowicie zmieniony na podstawie komentarzy)
Podczas wychodzenia z powłoki lub zamykania terminala procesy potomne będą wysyłane SIGHUP (zawieszenie, nazwa pochodzi od momentu, w którym terminale wybiorą numer do komputera z systemem UNIX), aby poinformować ich, że terminal nie jest już podłączony. Ponadto po zakończeniu procesu powłoki strumienie stdin, stdout i stderr procesu potomnego zostaną zamknięte. Zwykle powoduje to śmierć procesu potomnego. Zwykle jest to dobra rzecz, ponieważ pozwala uniknąć uruchamiania procesów bez użytkownika.
Celem tego nohup
programu jest utrzymanie procesu nawet po zakończeniu powłoki i odłączeniu terminala. Jako takie, kierowanie jego wyjścia do terminala całkowicie niweczy cel. Moja pierwotna odpowiedź ( nohup COMMAND | cat
) nie była pomocna, ponieważ: kiedy terminal jest zamknięty, wyjście kota jest zamknięte, więc kot umiera, co łamie rurę i wysyła SIGPIPE do procesu nohup, powodując jego śmierć. Odpowiedziałem na to pytanie, nie myśląc o celu.
Aby osiągnąć swój cel, uruchom, nohup COMMAND > FILE
aby wybrać nazwę pliku, do którego chcesz skierować dane wyjściowe. Następnie użyj, tail -f FILE
aby obejrzeć wyjście na terminalu.
Podobnie można użyć następującej konstrukcji powłoki: COMMAND >FILE 2>&1 </dev/null &
aby uruchomić polecenie, którego strumienie stdio nie są podłączone do terminala i mogą kontynuować działanie po zamknięciu terminala. Dodatkowo w zsh uruchom wbudowaną powłokę, disown
aby powiedzieć zsh, aby opuścił proces zamiast zabijać go po zakończeniu powłoki.