少打扰


13

我经常通过管道将程序输出减少到更少,例如

produce_output | less

这很有效,直到produce_output产生大量输出为止。如果我搜索文件深处的一些文本,则报告较少

Calculating line numbers... (interrupt to abort)

如果我用Control + C中断,它也会杀死produce_output,这将阻止它产生进一步的输出。有什么办法可以将中断发送的次数更少,从而使之produce_output继续运行?

我知道我可以使用kill -INT less_process,但我认为必须有一个更好的解决方案。

Answers:


15

通常,管道中的所有进程都在同一个进程组中运行,从而使所有进程都接收信号。您可以setsid foo | less用来foo在其他pgrp中运行。


鉴于OP提出的问题,似乎很不幸决定使用CTRL + C作为减少中断的方式。您知道为什么选择了此特定信号吗?其他信号是否会减少问题?
Piotr Dobrogost,2015年

@PiotrDobrogost:您还建议其他什么信号?没有很多具有专用键盘快捷键的,只有SIGINT(Ctrl-C)和SIGQUIT(Ctrl- \),后者是用来立即退出程序的,而不仅仅是中断。其余的只能通过访问kill
user1686

似乎该问题是由于使用信号中断较少而引起的。相反,如果它是一些普通的键/快捷键,那么我们首先不会遇到问题。但是我猜想对信号的需求来自于这样一个事实,即进程不能用来select同时等待来自文件/管道和终端的输入。
Piotr Dobrogost,2015年

@PiotrDobrogost:可以,这就是F(跟随)模式的工作方式。管道和tty以相同的方式轮询。
user1686

您为什么认为遵循模式有效?我认为事件的流程是外壳程序获取CTRL + C并将SIGINT信号发送给更少的主机,从而使该信号异步获取,而无需侦听键盘/终端。
Piotr Dobrogost,2015年

9

您可以使用

   -n or --line-numbers

选项。

produce_output | less -n

-1:可以解决OP的难题,但不回答OP的实际问题(即中断进程)。
goldPseudo 2012年

2
抱歉,先从不需要的功能开始,然后尝试发送信号以禁用可通过开关禁用的功能,这是一种解决方法,而不是解决方案。当然,@ grawity解决方案很好(我投了赞成票),但继续吧:在另一个小组中启动第一个进程以发送信号来中断不需要的任务(行计数)确实有点很多工作。
Matteo

1
这是对我在问题中提出的问题的公正解决方案。但是,中断停止的次数远不止行数减少了-例如,它们也会中断长时间的搜索。因此,@ grawity的解决方案是首选的,因为它将以更少的方式涵盖任何中断的使用。我的缺点是无法在问题中更清楚地解决这个问题!
Ed McMan 2012年

@EdMcMan当然,我也对重力的解决方案投了赞成票,我很高兴学习一些总是有用的新知识。
Matteo

0

在处理大量输出时,我发现将输出发送到文件并使用tail -fless +F观看非常有帮助,例如:

produce_output > out 2>&1 & less +F out

2>&1语法确保stdout和stderr都去out---如果只想将stdout放到文件中,则删除它。这样,您可以以多种方式检查输出(甚至来自不同机器的输出),而不必弄乱产生输出的程序。

请注意,这2>&1可能是特定于bash的(我不确定)。确保您有足够的磁盘空间用于输出文件:-)


Tail只会向您显示文件,Ed指定他正在使用较少的交互性(例如,他必须搜索文件)
Matteo 2012年

2>&1是POSIX,裸>&是bashism。
user1686

FWIW,2>&1也适用于Windows XP,7,2008年,等等
jftuga

@Matteo:是的,我应该less +F在示例中使用它;我刚刚更新了答案。
jrennie 2012年

1
@Matteo:行计数不是相同的问题less +F(因为它less +F处理生成的数据)。我给出的示例与最初发布的示例没有相同的问题:ctrl + c不会中断process_output。如果不关心“跟随”功能,则可以运行produce_output > out 2>&1,然后less out。问题produce_output | less在于,如果有任何东西使管道破裂(例如,意外地从中击出“ q” less),则该管道produce_output将死亡(无需特殊的SIGPIPE处理)。
jrennie 2012年

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.