![如何杀死一只离家出走的猫?](https://linux22.com/image/35687/%E5%A6%82%E4%BD%95%E6%9D%80%E6%AD%BB%E4%B8%80%E5%8F%AA%E7%A6%BB%E5%AE%B6%E5%87%BA%E8%B5%B0%E7%9A%84%E7%8C%AB%EF%BC%9F.png)
很多时候,我不小心cat
在内容多达几千行的文件上运行该命令。
我尝试使用+或+来终止cat
命令,但两者都只有在终端显示总输出后才生效,所以我必须等到完全执行。CtrlCCtrlZcat
cat
有没有更好的解决方案可以避免等待?因为有时文件大小可达 100MB,等待起来会很烦人。
我在用tcsh
。
答案1
如果相关文件包含大量数据,则发送信号实际上可以cat
在完成之前到达。您真正观察到的是终端的有限速度 -cat
将数据发送到终端,终端需要一些时间才能显示所有数据。
请记住,它通常必须为每一行输出重新绘制整个输出窗口(即将窗口的内容向上移动一行并在底部打印下一行)。虽然有一些技术和算法可以使这一过程比直接方式更快,但仍然需要一些时间。
因此,如果你想尽快摆脱输出,隐藏终端窗口,因为那时(通常)不会发生实际的重绘。在图形环境中,这可能意味着最小化窗口或切换到不同的虚拟桌面,在 Linux 虚拟控制台上只需切换到另一个虚拟桌面 (( Ctrl+) Alt+ )。Fx
另请注意,如果您通过慢速网络链接(例如通过 GSM 连接的 SSH)运行此程序,则在cat
被信号杀死之前您肯定会看到更少的输出,因为终端重绘的速度不会成为瓶颈不再有。
答案2
终端设置
我认为这更多地与终端的设置方式有关,而不是与任何缓冲问题有关。检查 的输出,如果在/处启用了- ,则stty -a | grep intr
应该intr = ^C;
在输出行上有该内容。如果没有,您可以使用它来启用它。将该行添加到您的或中以使其永久化(或删除首先更改它的行!)。CtrlCtty
pty
stty intr ^C
.tcshrc
.login
失败Ctrl- C,您也可以尝试SIGQUIT
用Ctrl-发送\。如果这不起作用,请再次检查stty -a | grep quit
设置是否正确。
终端仿真器设置
另请检查终端仿真器的设置(如果您正在使用终端仿真器),可能是在此级别设置了快捷方式(可能用于复制或其他内容),并且Ctrl-C未达到该pty
级别。还可以在桌面环境或 Windows 系统中的其他位置设置快捷方式。
如果您使用终端模拟器,对 Linux 的一个很好的测试是切换到 Linux 控制台 ( Ctrl- Alt- F1),在那里登录并查看是否出现相同的行为。如果没有,则表明问题出在您的 Windows 系统或终端仿真器上。
这可能是从设备读取数据之间的延迟问题,pty
如建议的那样彼得夫。但如果是这种情况,并且您实际上必须等待几分钟才能显示数据,那么终端模拟器肯定正在缓冲方式数据太多(或者你的电脑速度很慢)。答案是找到一种方法来减少终端仿真器设置中的缓冲区大小或使用不同的缓冲区大小。
额外小费
还有其他值得补充的内容;cat
如果我不小心使用了cat
二进制文件,我通常会陷入失控的情况。这样做的另一个影响可能是搞乱您的终端设置(如果二进制数据碰巧与各种终端转义码匹配,而这种情况经常发生)。如果tput
已安装(通常是默认安装),则可以使用以下命令避免重新启动:
tput reset
答案3
这就是tmux
选项c0-change-interval
和c0-change-trigger
设计的目的。无论如何,您应该使用屏幕管理器来恢复会话。
答案4
打开一个新控制台,例如通过单击控制台图标或按Ctrl+ Alt+ F2。在那里,输入
killall -9 cat
并且 cat 将被杀死,除非您有一个过时的 NFS 锁或“不间断睡眠”情况(在未设置超时的情况下读取坏扇区)。