Przekieruj nohup na standardowe wyjście

14

Czy można pozwolić procesowi rozpocząć się od nohup, napisać na stdout zamiast w pliku? a może w pliku i na ekranie?

nohup python start.py &

pisze nohup.out, ale chciałbym, aby wyświetlało się na ekranie, nohup jest rozumiany tylko jako zabezpieczenie, gdy połączenie zostanie zerwane.

Davoud Taghawi-Nejad
źródło
Ale co się stanie, gdy twój program wyjdzie po zerwaniu połączenia?
womble

Odpowiedzi:

4
  1. nohup python start.py & tail -f nohup.outtail -fMożna zabić i ponownie w razie potrzeby.

  2. screen python start.py i rozłącz / połącz ponownie do woli.

Henk Langeveld
źródło
10

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.outprzeciwnym 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 nohupprogramu 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 > FILEaby wybrać nazwę pliku, do którego chcesz skierować dane wyjściowe. Następnie użyj, tail -f FILEaby 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ę, disownaby powiedzieć zsh, aby opuścił proces zamiast zabijać go po zakończeniu powłoki.

dsh
źródło
1
Jeden fajny dodatek: jeśli polecenie nohup zostało już uruchomione z nazwą pliku, możesz użyć, tail -f filenameaby zobaczyć, co jest zapisane w pliku.
Hennes
Nie działa, gdy połączenie zostanie przerwane, plik nie jest już zapisywany
Davoud Taghawi-Nejad
Masz rację: odpowiedziałem na pytanie (wyślij dane wyjściowe do terminala), ale pokonałem cel. Odpowiednio przepisałem swoją odpowiedź.
dsh
-1
vladimir@lin-mint-cin:~$ tty<br>
/dev/pts/8<br>
vladimir@lin-mint-cin:~$ ln -sf /dev/pts/8 nohup.out<br>
vladimir@lin-mint-cin:~$ nohup ls<br>
nohup: ввод игнорируется, вывод добавляется в 'nohup.out'<br>
2019-05-31-090159.jpg    giphy.gif        nim_porojects   sketchbook
Aptana_Studio_Workspace  IdeaProjects         nohup.out       target
Desktop          jack_capture_01.wav  Pictures        Templates
Documents        lib              Postman         tmp
Downloads        mad              Projects        trace.edn
eclipse          Mail             prolog_ws       uinfild_hill-iskusstvo_shemotehniki_tom_1_izd4-e-1489315100.pdf
eclipse-dsl-workspace    Music            proxy-secret    Videos
eclipse-workspace    mygolo           Public          workspace-dltk
erlang_ex        my_golo_ws       rust-workspace  проекты
Vladimir Gamaley
źródło