如何在不影响生成输出的命令的情况下,停止以更少的时间跟踪输出?


12

我正在运行服务器,并且该服务器的日志已登录到终端,而不是任何文件中。我想减少查看该日志的次数。

node server.js | less

当我只想查看日志时,请使用Shift+ F来结束文件并继续查看日志。当我想停止它时,我使用CTRL+ C

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

这该怎么做?


1
您是否要退出less并返回shell提示,并使node服务器在后台运行,还是只想less回到正常的非跟随模式,即您可以滚动查看日志而不是观看最新的行?
字节指挥官

当我按CTRL + C时@ByteCommander。我希望我的服务器继续运行,并且我想回到不太普通的非跟随模式,在该模式下可以滚动。
Ajay Kumar

Answers:


17

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

node server.js > tmpfile & less tmpfile

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

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


13

看来通常不应该退出“ Forever forever”模式,这是手册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用于监视文件。


一个相当聪明的肮脏的hack。
TRiG

我认为我比已接受的答案更喜欢此答案。请注意,您可以运行%而不是fg; 我发现输入起来比较容易/快捷。而且似乎F(shift-f)仍然可以工作,即使没有做这hq招。真好!现在,当我关注日志时,我可以ctrl-z % Enter做些少做的事情,然后点击即可返回关注F
JoL

顺便说一句,你不应该把它称为肮脏的。就个人而言,这似乎比其他解决方案更干净,因为在这里,您不必用临时文件(必须考虑一个名称然后删除)来填充文件系统,尤其是当您可能想使用less's follows'时。可以同时在多个终端上使用。
JoL

2
我没有查看源代码,但这可能有用,因为TSTP信号中断了正在等待新数据到达的读取系统调用。less接收0字节并得出输出已结束的结论。为避免暂停服务器,请打开一个新的终端窗口。执行ps并标识流程的流程ID less;然后输入kill -TSTP <PID>; kill -CONT <PID>。这样,信号应该在不打扰的情况下背靠背传递。
Alexis

@alexis如果要使用kill,则可以只发送SIGINT。然后,您无需发送CONT,而less只是在等您。
muru

3

如您的问题所述:

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

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


命名管道,fifo文件。

我想出的是使用一个named pipe file也称为fifo文件的文件,该文件仅用于将日志发送到更少的文件,而不会保存任何内容。

首先创建一个fifo file

mkfifo mylog

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

node server.js > mylog &

减少阅读日志的次数(-f减少阅读此特殊文件的力):

less -f mylog

现在你可以使用shift+ F可循的,CTRL+ C停止跟随,但服务器仍在运行,您可以再次跟随输出shift+ F


备份计划:如果停止了服务器,则只需将命令(node server.js > mylog &)放入文件中,例如:server.sh,然后运行node server.js > mylog &run:,bash server.sh > mylog &然后运行less -f mylog


在这里使用fifo代替常规文件有什么意义?我能看到的唯一好处是节省了磁盘空间,但是我怀疑这是否与这样的事情有关。完成后,您仍然会有一个文件,必须手动删除。
terdon '17

2
我在这里建议使用FIFO,因为如果没有人请求(更多)日志数据时FIFO缓冲区已满,则服务器进程可能会停顿。如果日志文件的大小成为问题,则应确实使用正确的日志文件plus logrotate
David Foerster

@terdon正如您所说的,唯一的意义就是保存磁盘,我认为OP不想将他的日志保存在磁盘上。
Ravexina

@DavidFoerster +1好点;)
Ravexina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.