很多时候,我不小心cat
在内容最多几千行的文件上运行命令。
我尝试cat
使用Ctrl+ C或Ctrl+ 终止命令Z,但是这两个命令仅cat
在终端的总输出显示后才生效,因此我必须等到cat
完全执行后才能执行。
有没有更好的解决方案,可以避免等待?因为有时文件的大小最大为100MB,所以等待它会很烦人。
我正在使用tcsh
。
curiosity
命令...
alias curiosity='sudo killall cat'
很多时候,我不小心cat
在内容最多几千行的文件上运行命令。
我尝试cat
使用Ctrl+ C或Ctrl+ 终止命令Z,但是这两个命令仅cat
在终端的总输出显示后才生效,因此我必须等到cat
完全执行后才能执行。
有没有更好的解决方案,可以避免等待?因为有时文件的大小最大为100MB,所以等待它会很烦人。
我正在使用tcsh
。
curiosity
命令...
alias curiosity='sudo killall cat'
Answers:
如果所涉及的文件确实包含大量数据,则发送信号实际上可以cat
在完成之前到达。您真正观察到的是终端的有限速度- cat
将数据发送到终端,终端需要花费一些时间来显示所有数据。
请记住,通常它必须以某种方式为每行输出重新绘制整个输出窗口(即,将窗口的内容向上移动一行,并在底部打印下一行)。尽管有一些技术和算法可以使这种方法比直接方法更快,但仍然需要一些时间。
因此,如果您想尽快摆脱输出,请隐藏终端窗口,因为通常不会进行任何实际的重绘。在图形环境中,这可能意味着最小化窗口或切换到其他虚拟桌面,在Linux虚拟控制台上只需切换到另一个((Ctrl+)Alt+ )。Fx
还要注意,如果您通过慢速的网络链接(例如,通过GSM连接的SSH)运行此命令,那么在cat
被信号杀死之前,肯定会看到少得多的输出,因为终端的速度不再是瓶颈。
~?
以查看可用选项(~.
关闭)。
tty-stop-output
。然后,您可以发送Ctrl + C。要恢复输出,请按Ctrl + Q ...-
我认为这与终端设置的方式有关,而不是与任何缓冲问题有关。检查/的输出stty -a | grep intr
,intr = ^C;
如果/ 启用了Ctrl-,C则应该在输出行上。如果不是,您可以使用启用它。将行添加到您的或以使其永久(或首先删除更改该行的行!)。tty
pty
stty intr ^C
.tcshrc
.login
失败Ctrl- C,您也可以尝试SIGQUIT
使用Ctrl- 发送\。如果这不起作用,请再次检查stty -a | grep quit
它是否正确设置。
还要检查终端仿真器的设置(如果使用的是一个),则可能是在此级别设置了快捷方式(可能是用于复制或其他操作),并且Ctrl- C没有达到该pty
级别。也可以在桌面环境或Windows系统中的其他位置设置快捷方式。
Linux上的一个很好的测试,如果你使用的终端仿真器是切换到Linux控制台(Ctrl- - Alt),F1登录那里,看看是否出现同样的行为。如果不是,则表明问题出在您的Window系统或终端仿真器上。
pty
如peterph所建议的那样,从设备读取数据之间的延迟可能是一个问题。但是,如果是这样的话,你就确实有等待分钟要显示的数据,那么可以肯定的终端仿真器是缓冲的方式太多数据(或者你的电脑很慢)。答案将是找到一种方法来减少终端仿真器设置中的缓冲区大小或使用其他缓冲区大小。
其他值得补充的东西;cat
当我不小心cat
使用二进制文件时,通常会遇到失控的情况。这样做的另一个效果是搞砸了您的终端设置(如果二进制数据恰好与通常会匹配的各种终端转义码相匹配)。如果tput
已安装(通常是默认设置),则可以避免使用以下命令重新启动:
tput reset
本Ctrl- O自110波特天的选项已经在Unix中。当将长的ASCII文件转储到速度较慢的输出设备上并将整个文件放在设备驱动程序输出缓冲区中时,失控的cat命令始终是一个问题。 Ctrl- O将开始刷新缓冲区并进行后续操作Ctrl- O将关闭刷新,以便可以正常速度读取猫。Ctrl- O输入,整个文件将刷新并快速返回命令提示符。
未知Linux设备驱动程序编码人员是否需要继续添加此功能。此功能在其中设备驱动程序级别添加Ctrl- S和Ctrl- Q只能执行。我用它来转储带有大量检查打印的大型调试运行,然后向下滚动到需要查看的位置。
使用bash时,您可以使用 Ctrl+ 挂起作业Z,然后通过PID或通过遵循https://stackoverflow.com/questions/1624691/linux-kill-background-task的答案(例如,杀死-9)将其终止%%)
tcsh
而Ctrl + Z则无法使用...已经说明了。
打开新控制台,例如,通过单击控制台图标或按Ctrl+ Alt+ F2。在那里,进入
killall -9 cat
除非您拥有过时的NFS锁定或“不间断睡眠”情况(在没有设置超时的坏扇区上读取),否则猫和猫将被杀死。
cat
,而是关于cat
死亡之前已写入终端的内容,以及尚未被终端仿真器处理或显示的更不用说读取了(并且位于pty驱动程序内的(在Linux上大约为64kiB)缓冲区中) 。
drop_caches
控制内核用作缓存(通常用于文件系统)的页面,而不是终端,网络驱动程序等的内部缓冲区-如果这样做的话,将产生非常严重的后果,如Stéphane所指出的(基本上,您将丢失数据) 。
killall -9 cat
也不会杀死其他可能在其他进程线程中仍然表现良好的cat实例吗?
你可以尝试一下
重置显示使用ctrl-j
如果cat仍在运行,则打开一个新的终端并运行此pkill -9 -f cat
“这将终止 所有cat进程。”
pkill -f cat
在我的桌面上将杀死Xfce4任务栏的系统托盘区域。