很多时候,我不小心在内容多达几千行的文件上运行cat命令。 cat的输出显示在终端中,所以我必须等待直到cat完全执行。因为有时文件的大小最大为100MB,等待它会很烦人。

我正在使用cat

评论

使用诸如多,少,尾,头等命令可能是对cat的有趣替代。 (当然这不是答案...)

那是我读过的最伟大的问题标题。直到我看到问题的链接与UL有关,我认为您需要帮助来杀死潜逃的猫科动物。

在另一个SE站点的侧边栏问题上重做问题时,看到问题旁边的“ UL”徽标非常放心。没关系,继续。 (通常是Arquade的上下文标题看起来非常错误)

我会尝试好奇命令...

别名curiosity ='sudo killall cat'

#1 楼

如果所涉及的文件中确实包含大量数据,则发送信号实际上可以在完成之前到达cat。您真正观察到的是终端的有限速度-cat将数据发送到终端,并且终端需要花费一些时间才能显示所有数据。

请记住,通常必须以某种方式为每行输出重新绘制整个输出窗口(即,将窗口的内容向上移动一行,并在底部打印下一行)。尽管有一些技术和算法可以使这种方法比简单的方法更快,但仍然需要一些时间。

因此,如果您想尽快摆脱输出,请隐藏终端窗口,因为通常通常不会进行任何重绘。在图形环境中,这可能意味着最小化窗口或切换到其他虚拟桌面,在Linux虚拟控制台上,只需切换到另一个((Ctrl +)Alt + Fx)。

还要注意,如果您通过慢速的网络链接(例如,通过GSM连接的SSH)运行了此命令,那么在cat被信号杀死之前,您肯定会看到少得多的输出,因为终端的速度不再是瓶颈。 />

评论


如果您正在等待数据通过慢速SSH管道传输,则可以使用OpenSSH转义序列关闭连接。在新行中,键入〜?查看可用选项(〜。关闭)。

– RJHunter
15年1月1日,16:08

您还可以尝试使用Ctrl + S停止输出,该命令发送tty-stop-output。然后,您可以发送Ctrl + C。要恢复输出,请按Ctrl + Q ...

–马丁·图尔诺伊(Martin Tournoij)
2015年1月1日于17:52



@Carpetsmoker测试了一下,并没有在Ubuntu 14.04 +终结者+ zsh上停止文本的传递。

–muru
2015年1月1日19:13

@muru谢谢。我尝试对其进行测试,但无法重现该问题(看来我的系统太快了,或者我没有努力尝试)。

–马丁·图尔诺伊(Martin Tournoij)
2015年1月1日于20:08

@Carpetsmoker恐怕在这种情况下(快速的终端链接),软件流控制(即Ctrl + S)将无济于事-数据已经在终端缓冲区中,并等待终端处理它。因此,Ctrl + S会告诉应用程序停止发送更多数据,但是仍然必须显示已发送的内容。

–彼得
2015年1月1日,21:15

#2 楼

终端设置

我认为这更多地与终端设置方式有关,而不是与任何缓冲问题有关。检查stty -a | grep intr的输出,如果在intr = ^C; / tty上启用了Ctrl-C,则输出线上应该有pty。如果不是,您可以使用stty intr ^C启用它。将行添加到您的.tcshrc.login中以使其永久(或首先删除对其进行更改的行!)。 。如果这不起作用,请再次检查SIGQUIT以查看其是否正确设置。使用一个),可能是在此级别设置了快捷方式(可能是用于复制或其他操作),而Ctrl-C没有达到stty -a | grep quit级别。也可以在桌面环境或Windows系统中的其他位置设置快捷方式。

如果使用终端仿真器,则在Linux上进行的一项很好的测试是切换到Linux控制台(Ctrl-Alt-F1 ),在那里登录并查看是否发生相同的行为。如果不是,则表明问题出在您的Window系统或终端仿真器上。但是,如果是这种情况,并且您实际上确实需要等待几分钟才能显示数据,则可以肯定的是,终端仿真器正在缓冲太多数据(或者您的PC速度很慢)。答案将是找到一种方法来减少终端仿真器设置中的缓冲区大小,或使用其他设置。其他值得补充的东西;当我不小心pty是一个二进制文件时,我通常会陷入失控的情况。这样做的另一个效果是搞砸了您的终端设置(如果二进制数据恰巧与通常会执行的各种终端转义码匹配)。如果已安装pty(通常是默认设置),则可以避免使用以下命令重新启动:

tput reset


#3 楼

这就是tmux选件c0-change-intervalc0-change-trigger设计的目的。无论如何,您应该使用屏幕管理器进行可恢复的会话。

#4 楼

自从110波特天以来,Ctrl-O选项一直存在于Unix中。当将长ASCII文件转储到速度较慢的输出设备上并将整个文件放在设备驱动程序输出缓冲区中时,失控的cat命令始终是一个问题。 Ctrl-O将开始刷新缓冲区,后续Ctrl-O将关闭刷新,以便可以正常速度读取猫。输入Ctrl-O后,整个文件将刷新并迅速返回命令提示符。此功能是在只能实现Ctrl-S和Ctrl-Q的设备驱动程序级别添加的。我用它来转储带有大量检查打印的大型调试运行,然后向下滚动到需要查看的位置。

评论


Ctrl-O似乎并未在现代Linux中实现,至少在RHEL或Ubuntu服务器中未实现。

– dotancohen
15年2月24日在21:37

#5 楼

使用bash时,可以使用Ctrl + Z挂起作业,然后使用PID或遵循https://stackoverflow.com/questions/1624691/linux-kill-background-task的答案将其杀死(例如,kill) -9 %%)

评论


但我使用的是tcsh,而Ctrl + Z却不起作用...已经说过了。

–JigarGandhi
2015年1月1日下午13:55



是的,很抱歉,没有在您的帖子中看到您尝试了Ctrl + Z,而我错误地认为Ctrl + Z是由外壳程序处理的,而Ctrl + C是由应用程序处理的。这就是为什么我认为Ctrl + Z可以立即工作而Ctrl + C却不能工作的原因。

– Jannis
2015年1月7日14:45

#6 楼

打开一个新控制台,例如通过单击控制台图标或按Ctrl + Alt + F2。在这里输入

killall -9 cat


猫将被杀死,除非您拥有过时的NFS锁定或“不间断睡眠”情况(在没有设置超时的坏扇区上读取) 。

评论


问题不在于cat,而是关于cat在临死之前写到终端上的内容,还没有被终端仿真器处理或显示(更不用说被pty内部的缓冲区(在Linux上大约为64kiB))所读取或读取。驱动程序)。

–StéphaneChazelas
2015年1月1日19:54



然后,请尝试echo 3> / proc / sys / vm / drop_caches,这也会删除很多缓冲区。

–瑟斯登·斯塔克
2015年1月1日在20:46



不,那只会丢弃缓存的数据,永远不会那样做,因为那样会影响功能!

–StéphaneChazelas
2015年1月1日于20:54

@ThorstenStaerk drop_caches控制由内核(通常用于文件系统)用作缓存的页面,而不是终端,网络驱动程序等的内部缓冲区-如果这样做的话,将产生非常严重的后果,如Stéphane指出的(基本上,您将丢失数据)。

–彼得
2015年1月1日在21:52

Killall -9 cat也会杀死其他在其他进程线程中仍然表现良好的cat实例吗?

–乔
15年1月8日,下午1:38

#7 楼

您可以尝试使用此按钮

使用ctrl-j重置显示

如果cat仍在运行,则打开一个新终端并运行此pkill -9 -f cat“这将杀死所有cat进程。 “

评论


Ctrl + J不起作用

–JigarGandhi
2015年1月1日于10:46

用'-f cat'进行pkill是非常危险的,因为-f会在整个命令行中寻找'cat'模式,这很可能会发生,并导致不必要的结果...

– tonioc
15年1月1日,11:23

例如,我桌面上的pkill -f cat会杀死Xfce4任务栏的系统托盘区域。

–马克
2015年1月2日,上午8:12