¿Cómo puedo dejar de seguir la salida en menos, sin afectar el comando que genera la salida?

11

Estoy ejecutando un servidor y el registro de este servidor se registra en la terminal, no en ningún archivo. Me gustaría usar menos para ver este registro.

node server.js | less

Cuando solo quiero ver el registro, utilizo presionar Shift+ Fpara llegar al final del archivo y seguir viendo registros. Cuando quiero detenerlo, uso CTRL+ C.

Desafortunadamente, esto también detiene el servidor. Solo quiero dejar de ver el final del registro sin detener el servidor.

¿Como hacer esto?

Ajay Kumar
fuente
1
¿Desea salir lessy volver a su indicador de shell con el nodeservidor ejecutándose en segundo plano, o simplemente desea lessvolver al modo normal que no sigue, donde puede desplazarse por el registro en lugar de mirar las últimas líneas?
Byte Commander
@ByteCommander cuando presiono CTRL + C. Quiero que mi servidor continúe ejecutándose y quiero volver al modo de no seguimiento menos normal, donde puedo desplazarme.
Ajay Kumar

Respuestas:

16

No puedo encontrar ninguna forma de salir del Fmodo less, por lo que tendrá que usar una solución alternativa. Por ejemplo, guarde la salida en un archivo tmp y luego mire ese archivo tmp en su lugar:

node server.js > tmpfile & less tmpfile

El &hace que el node.jscomando ejecutar en segundo plano. Esto significa que less tmpfilecomenzará de inmediato y rastreará el archivo tmp.

Una vez dentro less, puede presionar Fpara ingresar al modo de seguimiento, pero ahora Ctrl+ Cno matará al servidor, solo detendrá el seguimiento. Ahora puedes desplazarte como quieras y presionar Fpara reanudar el seguimiento.

terdon
fuente
13

Parece que normalmente no se supone que salgas del modo "Reenviar para siempre", que es cómo el manual man lessnombra el modo que ingresas al presionar Shift+ F.

Sin embargo, encontré un pequeño truco sucio de cómo puedes volver a la normalidad de todos modos. Sin embargo, congelará brevemente el comando, por lo que no estoy seguro de si sería adecuado para su servidor, que probablemente debería ejecutarse ininterrumpidamente.


De todos modos, aquí está el truco:

Supongo que ha comenzado node server.js | lessy presionado Shift+ Fpara ingresar al modo "Reenviar para siempre". Ahora lessya no reacciona a ninguna pulsación de tecla.

En este estado, puede presionar Ctrl+ Cpara eliminar el proceso del servidor y luego puede salir lesspresionando Q(lo que sin embargo, por alguna razón, dejará el comando como proceso detenido en su lista de trabajos; debe ejecutarlo fgpara continuarlo y dejarlo completamente terminar después), pero esto no es lo que queremos.

En su lugar, también puede presionar Ctrl+ Zpara detener ("congelar") el comando y regresar a su indicador de shell. Ahora escriba rápidamente el comando shell fg( " f mineral g ronda") para permitir que el comando siga funcionando en primer plano. Tenga en cuenta que su nodeproceso de servidor también está en pausa durante este corto tiempo, debe considerar si esto es aceptable o no.

Así que ahora se lessestá ejecutando en primer plano de nuevo como antes, ¿verdad? Sí, pero mágicamente ya no está en modo "Reenviar para siempre". Puede usar, por ejemplo, las teclas de flecha nuevamente para desplazarse hacia arriba y hacia abajo.

Desafortunadamente, lessparece haber dejado de actualizar su búfer por completo, solo puede desplazarse hacia abajo hasta la línea en la que congeló el comando anteriormente, no más. Sin nodeembargo, el servidor todavía se está ejecutando y produciendo resultados, solo tenemos lessque actualizar nuevamente.

La forma más fácil de hacerlo es simplemente abrir less'pantalla de ayuda y cerrarla nuevamente, presionando las teclas Hy Qsecuencialmente. Ahora todo parece estar funcionando bien nuevamente.


Sin embargo, la solución más limpia probablemente sea seguir la respuesta de terdon y redirigir la salida a un archivo temporal, lesspara monitorear el archivo.

Byte Commander
fuente
Un truco sucio bastante brillante.
TRiG
Creo que prefiero esta respuesta a la aceptada. Tenga en cuenta que puede ejecutar en %lugar de fg; Me resulta más fácil / rápido escribir. También parece que F(shift-f) todavía funciona incluso sin hacer el hqtruco. ¡Agradable! Ahora, cuando sigo los registros, puedo ctrl-z % Enter, hacer lo menos posible, ¡y luego volver a seguir presionando F!
JoL
Por cierto, no deberías llamarlo sucio. Personalmente, esto parece más limpio que las otras soluciones, ya que, aquí, no tiene que llenar su sistema de archivos con archivos temporales (para lo cual debe pensar en un nombre y luego eliminarlo), especialmente cuando quiera usar lessel seguimiento de característica en múltiples terminales al mismo tiempo.
JoL
2
No he buscado en la fuente, pero esto probablemente funciona porque la TSTPseñal interrumpe la llamada al sistema de lectura que estaba esperando que llegaran nuevos datos; lessrecibe 0 bytes y concluye que la salida ha finalizado. Para evitar pausar el servidor, abra una nueva ventana de terminal; ejecutar pse identificar el id del lessproceso; luego escribe kill -TSTP <PID>; kill -CONT <PID>. De esta manera, las señales deben enviarse de forma consecutiva, sin demora mientras está escribiendo.
alexis
@alexis si vas a usar kill, puedes enviar SIGINT en su lugar. Entonces no necesitarás enviar CONT, y lesssolo te está esperando.
muru
3

Como dice tu pregunta:

Este servidor se registra en la terminal, no en ningún archivo.

Supongo que no desea utilizar un archivo de registro (temporal), tal vez su registro es enorme o por cualquier razón que tenga.


Pipa con nombre, fifoarchivo.

Lo que se me ocurrió es usar un archivo named pipe filetambién conocido fifo, este archivo solo se usará para canalizar sus registros a menos, y no se guardará nada en él.

Primero crea un fifo file:

mkfifo mylog

Ejecute su servidor y redirija los registros a este archivo:

node server.js > mylog &

Use less para leer sus registros (-f fuerza menos para leer este archivo especial):

less -f mylog

Ahora puede usar shift+ Fpara seguir y CTRL+ Cpara detener el seguimiento, pero el servidor aún se está ejecutando, puede seguir la salida nuevamente con shift+ F.


Plan de copia de seguridad : si detuvo su servidor, simplemente coloque su comando ( node server.js > mylog &) en un archivo, por ejemplo:, server.shluego, en lugar de ejecutar node server.js > mylog &run: bash server.sh > mylog &y luego ejecute el less -f mylog.

Ravexina
fuente
¿Cuál es el punto de usar un fifo en lugar de un archivo normal aquí? El único beneficio que puedo ver es ahorrar espacio en el disco, pero dudo que sea relevante para algo como esto. Todavía tendrá un archivo allí después de que haya terminado, que tendrá que eliminar manualmente.
terdon
2
Recomiendo contra un FIFO aquí porque el proceso del servidor puede detenerse si el búfer FIFO se llena cuando nadie solicita (más) datos de registro. Si el tamaño del archivo de registro se convierte en un problema, uno realmente debería usar un archivo de registro adecuado más logrotate.
David Foerster
@terdon Como dijiste, el único punto es guardar el disco, pensé que el OP no quiere que sus registros se guarden en el disco.
Ravexina
@DavidFoerster +1 Good Point;)
Ravexina