Reindirizza nohup a stdout


14

È possibile lasciare che un processo abbia inizio con nohup, scrivere su stdout invece che in un file? o forse nel file e sullo schermo?

nohup python start.py &

scrive nohup.out, ma mi piacerebbe che venisse visualizzato sullo schermo, nohup è inteso solo come copertura quando la connessione si interrompe.


Ma cosa succede quando il programma viene emesso dopo l'interruzione della connessione?
womble

Risposte:


4
  1. nohup python start.py & tail -f nohup.out Il tail -fpuò essere ucciso e riavviato a piacimento.

  2. screen python start.py e disconnettersi / riconnettersi a piacimento.


10

Da man nohup:

Se l'input standard è un terminale, reindirizzarlo da / dev / null. Se l'output standard è un terminale, aggiungere output a nohup.out se possibile, $HOME/nohup.outaltrimenti. Se l'errore standard è un terminale, reindirizzarlo all'output standard. Per salvare l'output su FILE, utilizzare nohup COMMAND > FILE.

(completamente rivisto in base ai commenti)
Quando si esce da una shell o si chiude un terminale, i processi figlio verranno inviati SIGHUP (riaggancio, il nome deriva dal momento in cui i terminali si collegherebbero al computer UNIX) per dire loro che il terminale non è più connesso. Inoltre, al termine del processo di shell, i flussi stdin, stdout e stderr del processo figlio verranno chiusi. Di solito questo fa morire il processo figlio. Di solito questa è una buona cosa perché evita di lasciare i processi in esecuzione senza utente.

Lo scopo del nohupprogramma è quello di mantenere il processo in esecuzione anche dopo il termine della shell e la disconnessione del terminale. Come tale, dirigere la sua uscita sul terminale sconfigge completamente lo scopo. La mia risposta originale ( nohup COMMAND | cat) non è stata utile perché: quando il terminale è chiuso, l'uscita del gatto è chiusa e quindi il gatto muore che rompe il tubo e invia un SIGPIPE al processo nohup facendolo morire. Avevo risposto alla domanda senza pensare allo scopo.

Per raggiungere il tuo scopo, esegui nohup COMMAND > FILEper selezionare il nome del file a cui indirizzare l'output. Quindi utilizzare tail -f FILEper guardare l'output su un terminale.

Allo stesso modo, si potrebbe usare il seguente costrutto shell: COMMAND >FILE 2>&1 </dev/null &per eseguire un comando i cui flussi stdio non sono collegati al terminale e possono continuare a funzionare dopo la chiusura del terminale. Inoltre, in zsh, esegui la shell-builtin disownper dire a zsh di abbandonare il processo invece di ucciderlo al termine della shell.


1
Una bella aggiunta: se il comando nohup era già stato avviato con un nome file, è possibile utilizzare tail -f filenameper vedere cosa è scritto nel file.
Hennes,

Non funziona, una volta
interrotta

Hai ragione: ho risposto alla domanda (invia l'output al terminale) ma ho sconfitto lo scopo. Ho riscritto la mia risposta di conseguenza.
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  проекты
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.