Redirigir nohup a stdout

14

¿Es posible dejar que un proceso comience con nohup, escribir en stdout en lugar de en un archivo? o tal vez en el archivo y en la pantalla?

nohup python start.py &

escribe nohup.out, pero me gustaría que salga a la pantalla, nohup solo se entiende como una cobertura cuando se corta la conexión.

Davoud Taghawi-Nejad
fuente
¿Pero qué sucede cuando su programa sale después de que la conexión se rompe?
womble

Respuestas:

4
  1. nohup python start.py & tail -f nohup.out Se tail -fpuede matar y reiniciar a voluntad.

  2. screen python start.py y desconectar / reconectar a voluntad.

Henk Langeveld
fuente
10

De man nohup:

Si la entrada estándar es una terminal, rediríjala desde / dev / null. Si la salida estándar es un terminal, agregue la salida a nohup.out si es posible, de lo $HOME/nohup.outcontrario. Si el error estándar es un terminal, rediríjalo a la salida estándar. Para guardar la salida en ARCHIVO, use nohup COMMAND > FILE.

(completamente revisado en función de los comentarios)
Al salir de un shell o cerrar un terminal, los procesos secundarios se enviarán SIGHUP (bloqueo, el nombre se origina desde el momento en que los terminales marcarían en la computadora UNIX) para decirles que el terminal no funciona Ya conectado. Además, cuando finaliza el proceso de shell, se cerrarán las secuencias stdin, stdout y stderr del proceso secundario. Por lo general, esto hace que el proceso del niño muera. Por lo general, esto es bueno porque evita que los procesos se ejecuten sin usuario.

El propósito del nohupprograma es mantener el proceso en ejecución incluso después de que el shell finalice y el terminal se desconecte. Como tal, dirigir su salida al terminal anula completamente el propósito. Mi respuesta original ( nohup COMMAND | cat) no fue útil porque: cuando el terminal está cerrado, la salida de cat está cerrada y cat muere, lo que rompe la tubería y envía un SIGPIPE al proceso de nohup que lo hace morir. Había respondido la pregunta sin pensar en el propósito.

Para lograr su propósito, ejecute nohup COMMAND > FILEpara seleccionar el nombre del archivo para dirigir la salida. Luego, use tail -f FILEpara ver la salida en un terminal.

De manera similar, se podría usar la siguiente construcción de shell: COMMAND >FILE 2>&1 </dev/null &para ejecutar un comando cuyas secuencias stdio no estén conectadas al terminal y puedan continuar ejecutándose después de que el terminal se cierre. Además, en zsh, ejecute el shell-builtin disownpara decirle a zsh que abandone el proceso en lugar de matarlo cuando finalice el shell.

dsh
fuente
1
Una buena adición: si el comando nohup ya se inició con un nombre de archivo, puede usar tail -f filenamepara ver lo que está escrito en el archivo.
Hennes
No funciona, una vez que la conexión se detiene, el archivo ya no se escribe
Davoud Taghawi-Nejad
Tienes razón: respondí la pregunta (enviar salida a la terminal) pero no cumplí el propósito. Reescribí mi respuesta en consecuencia.
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
fuente