Nik*_*ris 5 bash kill freeze nano
在我试图从一个简单的文本文件中获取唯一条目(读取行)时,我不小心执行了nano SomeTextFile | uniq.
这个“指令”使外壳(bash)完全(?)无响应/不可用——在Yakuake和Konsole 中进行了测试。我必须检索进程 ID (PID)(通过执行ps aux | grep nano)并手动sudo kill -9获取有问题的 PID。
无论如何,上面不能(或不应该?)返回一些错误消息吗?为什么不Ctrl+C杀死这条管道?有没有比 更简单或更干净的方法来阻止它kill -9?
cjh*_*cjh 10
管道符号将 的输出发送nano到uniq命令的输入。
但是,nano仍在运行并接收您的键盘输入。只是你看不到它的输出,因为uniq在它看到文件结束之前不会输出它的结果(这对问题并不重要)。
当您按下ctrl-c它时,nano 会“捕获”它,但不会导致它退出。
退出 nano 的方法是按ctrl-x,但是nano如果进行了修改,则不会退出,例如,如果您在进入后按了任何其他键。在这种情况下,nano 将提示您以下内容:
Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?
Y Yes
N No ^C Cancel
Run Code Online (Sandbox Code Playgroud)
按“n”键将退出而不保存更改。
您可能在意识到自己处于 nano 之前按下了几个组合键,在这种情况下,您可能会深入几个菜单。值得庆幸的是,在 nano 按下ctrl-x也会从大多数菜单中退出(但不会取消上述提示),这意味着ctrl-x多次按下将永远不会让您远离退出。
如果您“被困”在几个“深”菜单中,您通常可以通过按ctrl-x几次然后按n键来退出。 如果不工作,这意味着你按下ctrl-x一个时间太长many--只需按ctrl-x 一个更多的时间,其次是nkey--这将始终工作。
正如其他答案已经解释的那样,Ctrl+C不会杀死 Nano,因为 的输入nano仍然来自终端,并且终端仍然是nano控制终端,因此 Nano 将终端置于原始模式,其中控制字符如Ctrl+C被传送给程序并且不会被终端拦截以产生信号。
当被终端拦截时,Ctrl+C生成一个SIGINT信号。如果您知道进程 ID (可以使用(Linux语法)或其他进程列表实用程序nano找到),则可以发送此信号,其中 12345 是 PID。然而,SIGINT 按照惯例意味着\xe2\x80\x9c 返回到主循环\xe2\x80\x9d,而 Nano 在收到 SIGINT 时并不退出。相反,发送SIGTERM,这意味着 \xe2\x80\x9c 优雅地终止\xe2\x80\x9d;这是默认信号,因此您可以运行. 另一种可能性是;SIGHUP意味着 \xe2\x80\x9c 你不再有终端,优雅地退出,除非你可以没有 \xe2\x80\x9d 生活。如果所有其他方法都失败,请发送SIGKILL(或著名的),这会杀死程序,无论它是否想死。ps u -C nanopspgrep nanokill -INT 12345kill 12345kill -HUP 12345kill -KILL 12345kill -9 12345
许多程序,包括 Nano,都识别Ctrl+Z来暂停。这与发送SIGTSTP信号的序列相同。如果程序识别出此控制键,您将收到 shell 提示符,并且由于该程序成为后台作业,因此您可以轻松地终止它kill %%(这会向最后放入后台的作业发送信号)。
对于 Nano,有一种替代方法:向其发送退出键序列,即Ctrl+X如有必要,后面跟着Nfor \xe2\x80\x9cdon\'t save\xe2\x80\x9d。但总的来说,请记住这一点:
\n\nkill %%,如果这不会杀死程序kill -9 %%。ps -t pts/42列出终端上运行的进程/dev/pts/42)并终止它。