Como posso parar de seguir a saída em menos, sem afetar o comando que gera a saída?

11

Estou executando um servidor e o log desse servidor é registrado no terminal, não em nenhum arquivo. Eu gostaria de usar menos para visualizar este log.

node server.js | less

Quando eu apenas quero ver o log, uso a tecla Shift+ Fpara chegar ao final do arquivo e continuar assistindo os logs. Quando quero pará-lo, uso CTRL+ C.

Infelizmente, isso também interrompe o servidor. Eu só quero parar de assistir o final do log sem parar o servidor.

Como fazer isso?

Ajay Kumar
fonte
1
Deseja sair lesse retornar ao prompt do shell com o nodeservidor em execução em segundo plano ou apenas deseja lessvoltar ao modo normal de não seguir, em que é possível rolar pelo log em vez de observar as últimas linhas?
Byte Commander
@ByteCommander quando pressiono CTRL + C. quero que meu servidor continue em execução e quero voltar ao modo não normal menos normal, onde posso rolar.
precisa saber é o seguinte

Respostas:

16

Não consigo encontrar nenhuma maneira de sair do Fmodo less, então você precisará usar uma solução alternativa. Por exemplo, salve a saída em um arquivo tmp e observe o arquivo tmp:

node server.js > tmpfile & less tmpfile

O &faz com que o node.jscomando executado em segundo plano. Isso significa que less tmpfileserá iniciado imediatamente e rastreará o arquivo tmp.

Uma vez dentro less, você pode pressionar Fpara entrar no modo de acompanhamento, mas agora não Ctrl+ Cmata o servidor, ele apenas interrompe o acompanhamento. Agora você pode rolar como quiser e pressionar Fpara continuar.

Terdon
fonte
13

Parece que você normalmente não deve sair do modo "Encaminhar para sempre", que é como o manual man lessnomeia o modo que você entra ao pressionar Shift+ F.

No entanto, achei um truque sujo como você pode voltar ao normal de qualquer maneira. Ele congelará brevemente o comando, portanto, não tenho certeza se seria adequado para o servidor, o que provavelmente deve ser executado ininterruptamente.


Enfim, aqui está o truque:

Eu suponho que você já começou node server.js | lesse pressionou Shift+ Fpara entrar no modo "Avançar para sempre". Agora lessnão está mais reagindo a nenhum pressionamento de tecla.

Nesse estado, você pode pressionar Ctrl+ Cpara interromper o processo do servidor e poder sair lessdepois pressionando Q(que, por algum motivo, deixará o comando como processo parado na sua lista de tarefas - você deve executar fgpara continuar e deixá-lo completamente depois)), mas não é isso que queremos.

Em vez disso, você também pode pressionar Ctrl+ Zpara interromper ("congelar") o comando e retornar ao prompt do shell. Agora digite rapidamente o comando shell fg(" f ore g round") para permitir que o comando continue sendo executado em primeiro plano. Observe que o nodeprocesso do servidor também está pausado durante esse curto período de tempo; você deve considerar se isso é aceitável ou não.

Então, agora lessestá sendo executado em primeiro plano novamente como antes, certo? Sim, mas magicamente não está mais no modo "Encaminhar para sempre". Você pode usar, por exemplo, as teclas de seta novamente para rolar para cima e para baixo.

Infelizmente, lessparece que você parou de atualizar completamente seu buffer. Você pode rolar para baixo até a linha na qual congelou o comando anteriormente, e não mais. O nodeservidor ainda está em execução e produzindo saída, apenas precisamos lessatualizar novamente.

A maneira mais fácil de fazer isso é simplesmente abrir lessa tela de ajuda e fechá-la novamente, pressionando as teclas He Qsequencialmente. Agora tudo parece estar funcionando bem novamente.


A solução mais limpa, no entanto, é provavelmente seguir a resposta de terdon e redirecionar a saída para um arquivo temporário, usando-o lesspara monitorar o arquivo.

Byte Commander
fonte
Um truque sujo bastante brilhante.
TRiG 18/04
Eu acho que prefiro essa resposta à aceita. Observe que você pode executar em %vez de fg; Acho mais fácil / rápido digitar. Também parece que F(shift-f) ainda funciona mesmo sem fazer o hqtruque. Agradável! Agora, quando estou seguindo os logs, posso ctrl-z % Enterfazer o meu menos e voltar ao seguinte pressionando F!
Jol
BTW, você não deve chamar isso de sujo. Pessoalmente, isso parece mais limpo do que as outras soluções, pois, aqui, você não precisa sujar seu sistema de arquivos com arquivos temporários (para os quais você precisa pensar em um nome e depois remover), especialmente quando você pode querer usar lesso seguinte recurso em vários terminais ao mesmo tempo.
Jol
2
Não procurei na fonte, mas isso provavelmente funciona porque o TSTPsinal interrompe a chamada do sistema de leitura que aguardava a chegada de novos dados; lessrecebe 0 bytes e conclui que a saída terminou. Para evitar a pausa do servidor, abra uma nova janela do terminal; executar pse identificar a identificação do lessprocesso; então digite kill -TSTP <PID>; kill -CONT <PID>. Dessa forma, os sinais devem ser transmitidos sem demora enquanto você digita.
Alexis
@alexis Se você for usar kill, basta enviar o SIGINT. Então você não precisará enviar CONTe lessestá apenas esperando por você.
Muni
3

Como sua pergunta diz:

Este servidor é registrado no terminal, não em nenhum arquivo.

Suponho que você não queira usar um arquivo de log (temp), talvez o seu registro seja enorme ou por qualquer motivo.


Pipe nomeado, fifoarquivo.

O que eu inventei é usar um arquivo named pipe filetambém conhecido como fifoarquivo, esse arquivo será usado apenas para canalizar menos os logs e nada será salvo nele.

Primeiro, crie um fifo file:

mkfifo mylog

Execute seu servidor e redirecione os logs para este arquivo:

node server.js > mylog &

Use menos para ler seus logs (-f força menos para ler este arquivo especial):

less -f mylog

Agora você pode usar shift+ Fpara seguir e CTRL+ Cpara interromper, mas o servidor ainda está em execução, você pode seguir a saída novamente com shift+ F.


Plano de backup : se ele parou o servidor, basta colocar seu comando ( node server.js > mylog &) em um arquivo, por exemplo: : server.sh, em vez de executar, node server.js > mylog &execute: bash server.sh > mylog &e, em seguida, execute o less -f mylog.

Ravexina
fonte
Qual é o sentido de usar um fifo em vez de um arquivo normal aqui? O único benefício que posso ver é economizar espaço em disco, mas duvido que seja relevante para algo assim. Depois de terminar, você ainda terá um arquivo que deverá ser excluído manualmente.
terdon
2
Eu recomendo contra um FIFO aqui porque o processo do servidor pode parar se o buffer FIFO ficar cheio quando ninguém solicitar (mais) dados de log. Se o tamanho do arquivo de log se tornar um problema, deve-se realmente usar um arquivo de log adequado plus logrotate.
David Foerster
@terdon Como você disse que o único ponto é economizar disco, pensei que o OP não quer que seus logs sejam salvos no disco.
Ravexina
@DavidFoerster +1 Good Point;)
Ravexina