Shell SIGKILL 键绑定

Shell SIGKILL 键绑定

如何设置键绑定以将 发送SIGKILL到当前前台作业?我已经知道Ctrl+CSIGINT并且Ctrl+\SIGQUIT。我想要一个更严格的选择。

这有什么严重不妥吗?

答案1

无论是否不可取,这实际上是不可能的:

+ Ctrl[?] 键绑定实际上是由 tty 驱动程序而不是 shell 处理的,因为只要有一个进程在前台运行,终端的输入和输出就会直接转发到该进程。shell 永远无法响应(甚至看不到)您的按键。

Ctrl您可以从中获取当前分配的 +[?] 组合键列表stty -a;但是,只有intr(SIGINT,通常绑定到Ctrl+ C) quit(SIGQUIT,通常绑定到Ctrl+ \) 和susp(SIGSUSP,通常绑定到Ctrl+ Z) 对应于实际的 unix 信号。 (kill例如,不发送 SIGKILL,但删除当前输入。)

不幸的是,没有办法发送两个不能被进程禁用的信号(SIGKILL 和 SIGSTOP)中的一个,因此如果上述三个信号都不起作用,你就必须使用其他方式(例如另一个 shell)来杀死前台进程。

(实际上,除了捕获所有这三个信号之外,前台进程甚至可以通过将 tty 设置为“原始”模式来首先禁用特殊组合键。例如,SSH 就是这样做的 - 这就是它可以将本地按下的Ctrl+中继C到远程主机的方式。)

答案2

是的,有些事情不明智。你直接从信号跳到SIGINT信号SIGKILL。我建议,和其他人一样,在使用核选项之前考虑发送SIGHUPSIGTERM信号。然后,将其作为键绑定是不明智的,这当然意味着它仅在 ZLE 处于活动状态并且 shell 以交互方式提示您输入时才起作用,而不是在命令运行时。(为此,您需要配置终端,而不是 shell,并且需要有一个终端线路规则来实现将SIGTERMPOSIX 指定的行为作为扩展发送。)

就这一点而言,似乎还没有其他人注意到您询问的是 shell 行编辑器键绑定,而不是终端。要回答问题的第一部分,请执行以下操作:

您设置一个 shell 函数来将信号发送到“当前”作业。

function terminate-current-job() { kill -s TERM %+ ; }

然后构建一个调用此 shell 函数的 ZLE 用户定义小部件。

zle -N terminate-current-job terminate-current-job

然后,最后将该小部件绑定到您选择的键。

bindkey "^/" terminate-current-job

相关内容