Comment puis-je arrêter de suivre la sortie en moins, sans affecter la commande générant la sortie?

11

J'exécute un serveur et le journal de ce serveur est connecté au terminal, pas dans aucun fichier. J'aimerais utiliser moins pour afficher ce journal.

node server.js | less

Quand je veux juste voir le journal, j'utilise appuyez sur Shift+ Fpour arriver à la fin du fichier et continuer à regarder les journaux. Quand je veux l'arrêter, j'utilise CTRL+ C.

Malheureusement, cela arrête également le serveur. Je veux juste arrêter de regarder la fin du journal sans arrêter le serveur.

Comment faire ça?

Ajay Kumar
la source
1
Voulez-vous quitter lesset revenir à votre invite shell avec le nodeserveur exécuté en arrière-plan, ou voulez-vous simplement lessrevenir en mode normal non-suivant où vous pouvez faire défiler le journal au lieu de regarder les dernières lignes?
Byte Commander
@ByteCommander lorsque j'appuie sur CTRL + C. je veux que mon serveur continue de fonctionner et je veux revenir au mode non suivant moins normal, où je peux faire défiler.
Ajay Kumar

Réponses:

16

Je ne trouve aucun moyen de quitter le Fmode dans less, vous devrez donc utiliser une solution de contournement. Par exemple, enregistrez la sortie dans un fichier tmp, puis regardez ce fichier tmp à la place:

node server.js > tmpfile & less tmpfile

Le &fait node.jsexécuter la commande en arrière-plan. Cela signifie que less tmpfilecela démarrera immédiatement et suivra le fichier tmp.

Une fois dedans less, vous pouvez appuyer sur Fpour entrer en mode suivi mais maintenant Ctrl+ Cne tuera pas le serveur, il arrêtera seulement le suivi. Vous pouvez maintenant faire défiler comme vous le souhaitez et appuyez sur Fpour reprendre la suite.

terdon
la source
13

Il semble que vous ne soyez normalement pas censé quitter le mode "Forward forever", c'est ainsi que le manuel man lessnomme le mode que vous entrez lorsque vous appuyez sur Shift+ F.

Cependant, j'ai trouvé un petit truc sale pour revenir à la normale de toute façon. Cependant, cela gèlera brièvement la commande, donc je ne suis pas sûr qu'elle convienne à votre serveur qui devrait probablement fonctionner sans interruption.


Quoi qu'il en soit, voici l'astuce:

Je suppose que vous avez démarré node server.js | lessalredy et appuyé sur Shift+ Fpour passer en mode "Forward forever". Maintenant, il lessne réagit plus aux pressions de touches.

Dans cet état, vous pouvez appuyer sur Ctrl+ Cpour tuer le processus serveur et pouvoir quitter lessensuite en appuyant sur Q(ce qui, cependant, pour une raison quelconque, laissera la commande en tant que processus arrêté dans votre liste de travaux - vous devez exécuter fgpour la poursuivre et la laisser complètement terminer après), mais ce n'est pas ce que nous voulons.

Au lieu de cela, vous pouvez également appuyer sur Ctrl+ Zpour arrêter ("geler") la commande et revenir à votre invite shell. Tapez maintenant rapidement la commande shell fg(" f ore g round") pour laisser la commande continuer à s'exécuter au premier plan. Notez que votre nodeprocessus serveur est également suspendu pendant cette courte période, vous devez vous demander si cela est acceptable ou non.

Alors, maintenant, il lessfonctionne à nouveau au premier plan comme avant, non? Oui, mais comme par magie, il n'est plus en mode "Forward forever". Vous pouvez par exemple utiliser à nouveau les touches fléchées pour faire défiler vers le haut et vers le bas.

Malheureusement, lesssemble avoir complètement arrêté la mise à jour de son tampon, vous ne pouvez que faire défiler jusqu'à la ligne sur laquelle vous avez gelé la commande plus tôt, pas plus. Le nodeserveur est toujours en cours d' exécution et produire une sortie bien, il suffit de se lessrafraîchir à nouveau.

La façon la plus simple que j'ai trouvée de le faire est d'ouvrir simplement lessl'écran d'aide et de le refermer, en appuyant sur les touches Het de Qmanière séquentielle. Maintenant, tout semble fonctionner à nouveau correctement.


Cependant, la solution la plus propre est probablement de suivre la réponse de terdon et de rediriger la sortie vers un fichier temporaire, en utilisant lesspour surveiller le fichier.

Byte Commander
la source
Un hack sale plutôt brillant.
TRiG
Je pense que je préfère cette réponse à la réponse acceptée. Notez que vous pouvez exécuter %plutôt que fg; Je trouve plus facile / plus rapide à taper. Il semble également que F(shift-f) fonctionne toujours même sans faire l' hqaffaire. Agréable! Maintenant, quand je suis les journaux, je peux ctrl-z % Enter, faire mon moins, puis recommencer à suivre en appuyant F!
JoL
BTW, vous ne devriez pas l'appeler sale. Personnellement, cela semble plus propre que les autres solutions que, ici, vous n'avez pas à la litière de votre système de fichiers avec des fichiers temporaires (pour lesquels vous devez penser à un nom, puis supprimer), surtout quand vous pouvez utiliser lessest suivi fonction dans plusieurs terminaux en même temps.
JoL
2
Je n'ai pas regardé la source, mais cela fonctionne probablement parce que le TSTPsignal interrompt l'appel système de lecture qui attendait l'arrivée de nouvelles données; lessreçoit 0 octet et conclut que la sortie est terminée. Pour éviter de suspendre le serveur, ouvrez une nouvelle fenêtre de terminal; exécuter pset identifier l'ID de lessprocessus du processus; puis tapez kill -TSTP <PID>; kill -CONT <PID>. De cette façon, les signaux devraient être délivrés dos à dos, sans délai pendant que vous tapez.
alexis
@alexis si vous comptez utiliser kill, vous pouvez simplement envoyer SIGINT à la place. Ensuite, vous n'aurez pas besoin d'envoyer CONTet lessvous attend juste.
muru le
3

Comme le dit votre question:

Ce serveur est connecté au terminal, pas dans aucun fichier.

Je suppose que vous ne voulez pas utiliser un fichier journal (temporaire), peut-être que votre journal est énorme ou pour quelque raison que ce soit.


Pipe nommée, fifofichier.

Ce que j'ai trouvé est d'utiliser un fichier named pipe fileégalement connu sous le nom de fifofichier, ce fichier uniquement sera utilisé pour rediriger vos journaux vers moins, et rien ne sera enregistré dessus.

Créez d'abord un fifo file:

mkfifo mylog

Exécutez votre serveur et redirigez les journaux vers ce fichier:

node server.js > mylog &

Utilisez moins pour lire vos journaux (-f force moins à lire ce fichier spécial):

less -f mylog

Vous pouvez maintenant utiliser shift+ Fpour suivre et CTRL+ Cpour arrêter le suivi, mais le serveur est toujours en cours d'exécution, vous pouvez de nouveau suivre la sortie avec shift+ F.


Plan de sauvegarde : S'il a arrêté votre serveur, il suffit de mettre votre commande ( node server.js > mylog &) dans un fichier par exemple:, server.shpuis au lieu d'exécuter node server.js > mylog &run: bash server.sh > mylog &et d'exécuter ensuite less -f mylog.

Ravexina
la source
Quel est l'intérêt d'utiliser un fifo au lieu d'un fichier normal ici? Le seul avantage que je peux voir est d'économiser de l'espace disque, mais je doute que ce soit pertinent pour quelque chose comme ça. Après avoir terminé, vous aurez toujours un fichier que vous devrez supprimer manuellement.
terdon
2
Je recommande contre un FIFO ici parce que le processus du serveur peut se bloquer si le tampon FIFO est plein lorsque personne ne demande (plus) de données de journal. Si la taille du fichier journal devient un problème, il faut vraiment utiliser un fichier journal approprié plus logrotate.
David Foerster
@terdon Comme vous l'avez dit, le seul point est de sauvegarder le disque, je pensais que l'OP ne voulait pas que ses journaux soient enregistrés sur le disque.
Ravexina
@DavidFoerster +1 Good Point;)
Ravexina