Shell SIGKILL键绑定


18

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

有什么严重不建议的做法吗?


它是由终端驱动程序发送的,而不是由外壳程序发送的(外壳程序完全不知道您在使用程序做什么)。
user1686

您尚未注意到指定的shell(即)zsh,也没有注意到问题涉及键绑定的事实。这是关于配置zsh行编辑器的问题,而不是关于设置终端的问题。
JdeBP

Answers:


26

是否不建议,实际上是不可能的:

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

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

不幸的是,无法发送无法被进程禁用的两个信号之一(SIGKILL和SIGSTOP),因此,如果上述三个信号均无效,则必须使用其他方式(例如另一个shell)杀死前台进程。

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


3

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

关于这一点,似乎没有人注意到您正在询问的是shell行编辑器的键盘绑定,而不是终端。要回答问题的第一部分,然后:

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

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

然后,构造一个ZLE用户定义的小部件,以调用此Shell函数。

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

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

bindkey "^/" terminate-current-job

1
我猜他实际上不是在谈论行编辑器-如果他在shell中键入内容,就不会有正在运行的前台进程,对吗?如果存在运行中的前台进程并将其连接到当前tty,则Shell实际上不会看到按键。
lxgr 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.