如何在不影响生成输出的命令的情况下停止跟踪 less 中的输出?

如何在不影响生成输出的命令的情况下停止跟踪 less 中的输出?

我正在运行一个服务器,该服务器的日志记录在终端中,而不是任何文件中。我想使用 less 查看此日志。

node server.js | less

当我只想查看日志时,我会按Shift+F转到文件末尾并继续查看日志。当我想停止时,我会使用CTRL+ C

不幸的是,这也会停止服务器。我只是想停止查看日志的结尾而不停止服务器。

这个怎么做?

答案1

我找不到退出该F模式的任何方法less,因此您必须使用变通方法。例如,将输出保存到 tmp 文件,然后改为查看该 tmp 文件:

node server.js > tmpfile & less tmpfile

使&命令node.js在后台运行。这意味着less tmpfile将立即启动并跟踪临时文件。

进入后less,您可以按F进入跟随模式,但现在Ctrl+C不会终止服务器,它只会停止跟随。您现在可以随意滚动,并可以按F恢复跟随。

答案2

似乎您通常不应该退出“永远前进”模式,这是手册对按+man less时进入的模式的命名。ShiftF

但是,我发现了一个可以让你恢复正常的小技巧。不过,它会短暂地冻结命令,所以我不确定它是否适合你的服务器,因为你的服务器可能应该不间断地运行。


无论如何,这里有一个窍门:

我假设您已启动node server.js | less并按下Shift+F进入“永久前进”模式。现在less不再对任何按键做出反应。

在这种状态下,您可以按Ctrl+C来终止服务器进程,然后less按退出Q(但由于某种原因,这会将命令保留为作业列表中的停止进程 - 您必须运行fg才能继续执行并让其完全终止),但这是不是我们想要的。

相反,您也可以按Ctrl+Z来停止(“冻结”)命令并返回到 shell 提示符。现在快速输入 shell 命令fg(“F矿石G您可以使用以下命令运行该命令: 1. 单击“循环”按钮,让命令继续在前台运行。请注意,您的node服务器进程也会在这短暂的时间内暂停,您必须考虑这是否可以接受。

那么现在less又像以前一样在前台运行了,对吗?是的,神奇的是,它不再处于“永远前进”模式。您可以再次使用箭头键来上下滚动。

不幸的是,less似乎已完全停止更新其缓冲区,您只能向下滚动到之前冻结命令的那一行,而不能再往前滚动。node不过,服务器仍在运行并产生输出,我们只需less再次刷新即可。

我发现最简单的方法是打开“帮助屏幕”并再次关闭它,方法是依次按下和less键。现在一切似乎又正常工作了。HQ


然而,最干净的解决方案可能是terdon 的回答并将输出重定向到临时文件,用于less监视该文件。

答案3

正如你的问题所说:

该服务器登录在终端,而不是任何文件中。

我假设您不想使用(临时)日志文件,也许您的日志太大或者出于其他原因。


命名管道,fifo文件。

我想到的是使用一个named pipe file也称为fifo文件的文件,这个文件仅用于将您的日志传输到 less,并且不会保存任何内容。

首先创建一个fifo file

mkfifo mylog

运行您的服务器并将日志重定向到此文件:

node server.js > mylog &

使用 less 读取你的日志(-f 强制 less 读取这个特殊文件):

less -f mylog

现在您可以使用shift+F来跟踪,使用CTRL+来停止跟踪,但服务器仍在运行,您可以再次使用+C来跟踪输出。shiftF


后备方案:如果它停止了你的服务器,只需把你的命令(node server.js > mylog &)放入一个文件中,例如:server.sh,然后而不是运行node server.js > mylog &运行:bash server.sh > mylog &然后运行less -f mylog

相关内容