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

Aja*_*mar 14 command-line pipe less

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

node server.js | less
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,这也会停止服务器。我只想在不停止服务器的情况下停止观看日志的结尾。

这该怎么做?

ter*_*don 19

我在 中找不到任何退出F模式的方法less,因此您必须使用解决方法。例如,将输出保存到 tmp 文件,然后改为观察该 tmpfile:

node server.js > tmpfile & less tmpfile
Run Code Online (Sandbox Code Playgroud)

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

进入后less,您可以按F进入关注模式,但现在Ctrl+C不会杀死服务器,它只会停止关注。您现在可以随意滚动并点击F继续关注。


Byt*_*der 15

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

但是,我发现了一个小技巧,无论如何您都可以恢复正常。不过它会暂时冻结命令,所以我不确定它是否适合你的服务器,它应该可以不间断地运行。


无论如何,这是诀窍:

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

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

相反,您也可以按Ctrl+Z停止(“冻结”)命令并返回到您的 shell 提示符。现在快速输入shell命令fg(“ ˚F轮”),以便让命令继续在前台运行。请注意,您的node服务器进程也在这段时间内暂停,您必须考虑这是否可以接受。

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

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

我发现最简单的方法是简单地打开less' 帮助屏幕并再次关闭它,通过按键HQ顺序。现在一切似乎又正常了。


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

  • 我没有查看源代码,但这可能是因为“TSTP”信号中断了等待新数据到达的读取系统调用;`less` 接收 0 字节并得出输出已结束的结论。为避免暂停服务器,请打开一个新的终端窗口;执行 `ps` 并识别 `less` 进程的进程 ID;然后输入`kill -TSTP <PID>; kill -CONT <PID>`。这样,在您打字时,信号应该可以连续传递,而不会出现延迟。 (2认同)