Shell 程序不对 SIGINT 作出反应,因此kill $(pidof shell)
无法终止它们。当我使用 时kill -9 $(pidof shell)
,shell 按照我的预期立即退出,但会话中的历史记录丢失了。
鉴于您无法直接输入,有没有办法“安全地”杀死 shell 而不丢失历史记录(就像向它发送 EOF 一样)?
答案1
向它发送 SIGHUP – 这是用于指示终端已“挂断”的信号(包括关闭 GUI 终端窗口或丢失 SSH 连接时)。大多数交互式程序会将其解释为干净退出的信号。
真正的挂断电话会向全部进程以终端作为控制 tty,因此您也应该这样做(例如使用pkill -HUP -t pts/1
)。无论终端是在 shell 提示符下处于空闲状态,还是打开了文本编辑器,或者其他什么,这都可以正常工作。
(“挂断”一词源自通过调制解调器在实际电话呼叫中访问的拨入终端。)
注意:如果这是一个图形终端,则不需要将 SIGHUP 发送到终端仿真器本身——无论如何,它会在 shell 退出时立即退出。
在 Linux 上,如果您拥有 root 权限,则可以使用 TIOCSTI ioctl 将虚假输入发送到另一个终端线路。您可以找到一个小程序“writevt.c”,它可用于例如发送exit\n
或任何其他输入,就好像它是在该终端上输入的一样。