如何杀死一只失控的猫?


128

很多时候,我不小心cat在内容最多几千行的文件上运行命令。

我尝试cat使用Ctrl+ CCtrl+ 终止命令Z,但是这两个命令仅cat在终端的总输出显示后才生效,因此我必须等到cat完全执行后才能执行。

有没有更好的解决方案,可以避免等待?因为有时文件的大小最大为100MB,所以等待它会很烦人。

我正在使用tcsh


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

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

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

12
我会尝试curiosity命令...
Sekhemty

4
alias curiosity='sudo killall cat'
cas

Answers:


76

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

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

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

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


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

11
您也可以尝试使用Ctrl + S停止发送输出tty-stop-output。然后,您可以发送Ctrl + C。要恢复输出,请按Ctrl + Q ...-
马丁·图诺伊

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

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

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

4

终端设定

我认为这与终端设置的方式有关,而不是与任何缓冲问题有关。检查/的输出stty -a | grep intrintr = ^C;如果/ 启用了Ctrl-,C则应该在输出行上。如果不是,您可以使用启用它。将行添加到您的或以使其永久(或首先删除更改该行的行!)。ttyptystty intr ^C.tcshrc.login

失败Ctrl- C,您也可以尝试SIGQUIT使用Ctrl- 发送\。如果这不起作用,请再次检查stty -a | grep quit它是否正确设置。

终端仿真器设置

还要检查终端仿真器的设置(如果使用的是一个),则可能是在此级别设置了快捷方式(可能是用于复制或其他操作),并且Ctrl- C没有达到该pty级别。也可以在桌面环境或Windows系统中的其他位置设置快捷方式。

Linux上的一个很好的测试,如果你使用的终端仿真器是切换到Linux控制台(Ctrl- - Alt),F1登录那里,看看是否出现同样的行为。如果不是,则表明问题出在您的Window系统或终端仿真器上。

ptypeterph所建议的那样,从设备读取数据之间的延迟可能是一个问题。但是,如果是这样的话,你就确实有等待分钟要显示的数据,那么可以肯定的终端仿真器是缓冲的方式太多数据(或者你的电脑很慢)。答案将是找到一种方法来减少终端仿真器设置中的缓冲区大小或使用其他缓冲区大小。

额外提示

其他值得补充的东西;cat当我不小心cat使用二进制文件时,通常会遇到失控的情况。这样做的另一个效果是搞砸了您的终端设置(如果二进制数据恰好与通常会匹配的各种终端转义码相匹配)。如果tput已安装(通常是默认设置),则可以避免使用以下命令重新启动:

tput reset

3

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


1

Ctrl- O自110波特天的选项已经在Unix中。当将长的ASCII文件转储到速度较慢的输出设备上并将整个文件放在设备驱动程序输出缓冲区中时,失控的cat命令始终是一个问题。 Ctrl- O将开始刷新缓冲区并进行后续操作Ctrl- O将关闭刷新,以便可以正常速度读取猫。Ctrl- O输入,整个文件将刷新并快速返回命令提示符。

未知Linux设备驱动程序编码人员是否需要继续添加此功能。此功能在其中设备驱动程序级别添加Ctrl- SCtrl- Q只能执行。我用它来转储带有大量检查打印的大型调试运行,然后向下滚动到需要查看的位置。


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

-1

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


3
但我正在使用,tcsh而Ctrl + Z则无法使用...已经说明了。
JigarGandhi'1

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

-1

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

killall -9 cat

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


10
问题不在于cat,而是关于cat死亡之前已写入终端的内容,以及尚未被终端仿真器处理或显示的更不用说读取了(并且位于pty驱动程序内的(在Linux上大约为64kiB)缓冲区中) 。
斯特凡Chazelas

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

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

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

1
killall -9 cat也不会杀死其他可能在其他进程线程中仍然表现良好的cat实例吗?
2015年

-7

你可以尝试一下

重置显示使用ctrl-j

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


Ctrl + J不起作用
JigarGandhi'1

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

2
例如,pkill -f cat在我的桌面上将杀死Xfce4任务栏的系统托盘区域。
Mark
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.