Come posso smettere di seguire l'output in meno, senza influire sul comando che genera l'output?


12

Sto eseguendo un server e il registro di questo server viene registrato nel terminale, non in alcun file. Vorrei usare meno per visualizzare questo registro.

node server.js | less

Quando voglio solo vedere il registro, uso premere Shift+ Fper arrivare alla fine del file e continuare a guardare i registri. Quando voglio fermarlo, uso CTRL+ C.

Sfortunatamente, questo arresta anche il server. Voglio solo smettere di guardare la fine del registro senza arrestare il server.

Come fare questo?


1
Vuoi uscire lesse tornare al prompt della shell con il nodeserver in esecuzione in background o vuoi solo lesstornare alla normale modalità non-follower in cui puoi scorrere il registro invece di guardare le ultime righe?
Byte Commander

@ByteCommander quando premo CTRL + C. Voglio che il mio server continui a funzionare e voglio tornare alla modalità non normale meno normale, dove posso scorrere.
Ajay Kumar,

Risposte:


17

Non riesco a trovare alcun modo per uscire dalla Fmodalità less, quindi dovrai usare una soluzione alternativa. Ad esempio, salva l'output in un file tmp e guarda invece quel file tmp:

node server.js > tmpfile & less tmpfile

La &rende il node.jscomando di funzionare in background. Questo significa che less tmpfileinizierà immediatamente e seguirà il file tmp.

Una volta dentro less, puoi premere Fper accedere alla modalità follow ma ora Ctrl+ Cnon ucciderà il server, fermerà solo il follow. Ora puoi scorrere come desideri e premere Fper riprendere a seguire.


13

Sembra che normalmente non si debba uscire dalla modalità "Inoltra per sempre", ovvero il modo in cui il manuale man lessnomina la modalità che si immette quando si preme Shift+ F.

Tuttavia, ho trovato un piccolo trucco per poter tornare alla normalità comunque. Tuttavia, bloccherà brevemente il comando, quindi non sono sicuro che sarebbe adatto al tuo server che probabilmente dovrebbe funzionare senza interruzioni.


Comunque, ecco il trucco:

Presumo che tu abbia avviato node server.js | lessAlredy e abbia premuto Shift+ Fper accedere alla modalità "Avanti per sempre". Ora lessnon reagisce più ai tasti premuti.

In questo stato, è possibile premere Ctrl+ Cper interrompere il processo del server ed essere in grado di uscire lesssuccessivamente premendo Q(che tuttavia per qualche motivo lascerà il comando come processo interrotto nell'elenco dei lavori - è necessario eseguire fgper continuare e lasciarlo completamente terminare in seguito), ma non è questo ciò che vogliamo.

Invece, puoi anche premere Ctrl+ Zper interrompere ("congelare") il comando e tornare al prompt della shell. Ora rapidamente digitare il comando di shell fg( " f minerale g rotonda") per consentire al comando di continuare l'esecuzione in primo piano. Si noti che anche il nodeprocesso del server viene messo in pausa durante questo breve periodo, è necessario considerare se ciò è accettabile o meno.

Quindi ora lessè di nuovo in esecuzione in primo piano come prima, giusto? Sì, ma magicamente non è più in modalità "Avanti per sempre". Ad esempio, è possibile utilizzare nuovamente i tasti freccia per scorrere su e giù.

Sfortunatamente, lesssembra aver smesso di aggiornare completamente il suo buffer, puoi solo scorrere verso il basso fino alla riga in cui hai congelato il comando prima, non oltre. Il nodeserver è ancora in esecuzione e produce output, tuttavia non ci resta lessche aggiornare di nuovo.

Il modo più semplice che ho trovato per farlo è semplicemente aprire lessla schermata di aiuto e chiuderla di nuovo, premendo i tasti He in Qsequenza. Ora tutto sembra funzionare di nuovo bene.


La soluzione più pulita, tuttavia, è probabilmente quella di seguire la risposta di Terdon e reindirizzare l'output su un file temporaneo, usando lessper monitorare il file.


Un trucco sporco piuttosto brillante.
TRiG

Penso di preferire questa risposta a quella accettata. Si noti che è possibile eseguire %anziché fg; Trovo più facile / veloce digitare. Inoltre sembra che F(shift-f) funzioni ancora anche senza fare il hqtrucco. Bello! Ora, quando seguo i registri, posso ctrl-z % Enterfare meno cose, quindi tornare a seguire colpendo F!
JoL

A proposito, non dovresti chiamarlo sporco. Personalmente, questo sembra più pulito rispetto alle altre soluzioni in quanto, qui, non devi sporcare il tuo filesystem con file temporanei (per i quali devi pensare a un nome e quindi rimuovere), specialmente quando potresti voler usare lessil follow funzione in più terminali contemporaneamente.
JoL

2
Non ho cercato nella fonte, ma probabilmente funziona perché il TSTPsegnale interrompe la chiamata di sistema di lettura che era in attesa dell'arrivo di nuovi dati; lessriceve 0 byte e conclude che l'output è terminato. Per evitare di mettere in pausa il server, aprire una nuova finestra del terminale; eseguire pse identificare l'ID del lessprocesso; quindi digitare kill -TSTP <PID>; kill -CONT <PID>. In questo modo i segnali dovrebbero essere consegnati schiena contro schiena, senza ritardi durante la digitazione.
alexis,

Se vuoi usare @alexis kill, puoi semplicemente inviare SIGINT. Quindi non dovrai inviare CONTe ti lesssta solo aspettando.
muru,

3

Come dice la tua domanda:

Questo server viene collegato al terminale, non in alcun file.

Presumo che tu non voglia usare un file di registro (temp), forse il tuo registro è enorme o per qualsiasi motivo tu abbia.


Pipa denominata, fifofile.

Quello che mi è venuto in mente è l'utilizzo di un file named pipe filenoto anche come fifofile, questo file verrà utilizzato solo per reindirizzare i log a meno e non verrà salvato nulla su di esso.

Per prima cosa crea un fifo file:

mkfifo mylog

Esegui il tuo server e reindirizza i log su questo file:

node server.js > mylog &

Usa less per leggere i tuoi log (-f forza meno per leggere questo file speciale):

less -f mylog

Ora puoi usare shift+ Fper seguire e CTRL+ Cper interrompere il seguito, ma il server è ancora in esecuzione, puoi seguire di nuovo l'output con shift+ F.


Piano di backup : se il server è stato arrestato, inserisci semplicemente il tuo comando ( node server.js > mylog &) in un file, ad esempio server.sh:, invece di eseguire node server.js > mylog &run: bash server.sh > mylog &e quindi eseguire less -f mylog.


Che senso ha usare un file FIFO anziché un file normale qui? L'unico vantaggio che posso vedere è risparmiare spazio su disco, ma dubito che sarà rilevante per qualcosa di simile. Avrai ancora un file lì dopo aver finito che dovrai eliminare manualmente.
terdon,

2
Sconsiglio qui un FIFO perché il processo del server potrebbe bloccarsi se il buffer FIFO è pieno quando nessuno richiede (più) dati di registro. Se la dimensione del file di registro diventa un problema, è necessario utilizzare un file di registro appropriato logrotate.
David Foerster,

@terdon Come hai detto, l'unico punto è salvare il disco, ho pensato che l'OP non volesse che i suoi registri fossero salvati sul disco.
Ravexina,

@DavidFoerster +1 Good Point;)
Ravexina,
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.