我可以使用键绑定向终端仿真器中的当前进程发送 KILL 信号吗?

我可以使用键绑定向终端仿真器中的当前进程发送 KILL 信号吗?

Bash终端模拟器可以分别通过和向进程发送SIGINT和。SIGSTOP SIGTSTPC-cC-z(1) (2)

我有一个进程忽略这两个信号 ( tmux wait-for hello)?有没有一种简单的方法可以终止这个进程,而无需查找其 PID 并通过键绑定向其发送信号(例如通过发送SIGKILL)?

答案1

这个假设是不正确的。这些组合键由终端(模拟器)而不是 shell 解释。外壳看不到它们。

您可以使用 停止前台进程^Z,然后执行kill -KILL %%。您可能可以通过键绑定来完成第二部分。

答案2

发送 SIGINT/SIGQUIT/SIGTSTP 的不是终端模拟器,而是内核中的终端或伪终端设备驱动程序。

假设它被配置为stty intr '^C',例如,当通过串行连接从终端或从伪终端的主端的终端仿真器接收到^C字符(字节)时,内核将 SIGINT 信号发送到进程中的所有进程。0x3前台进程组tty 设备的(并且它是您的交互式 shell 决定在任何给定时间哪个是前台进程组)。

在 Linux 上,至少没有等效的终端驱动程序 (termios) 设置来将字符映射到发送到前台进程组的 SIGKILL 信号。

终端仿真xterm器可以配置为发送一些信号,包括 SIGKILL 以及send-signal(kill)对某些 X11 事件(例如 KeyPress 事件)的操作

xterm -xrm 'XTerm.VT100.translations: #override Ctrl <Key>k: send-signal(kill)'

例如,将启动一个在+xterm上发送 SIGKILL 的程序。Ctrlk

在使用 + MouseButton1 获得的默认菜单中Ctrl,您可以对条目执行相同的操作Send KILL Signal

但是,它会将其发送到通常为运行 shell 而自己创建的进程组,而不是从属终端设备的前台进程组。所以它可能不会做你想做的事。

即使您找到了一种让终端模拟器向前台进程组发送 SIGKILL 的方法,首先,如果进程作为不同的 uid 运行,它也无法执行此操作,而且它也不会执行您想要的操作,例如您在其中启动了一个ssh// script...screen会话,因为它随后需要将信号发送到前台进程组他们的终端设备。

答案3

如果您使用的是 GUI 终端仿真器,它很可能可以发送 SIGKILL,只需查看其菜单即可。我使用 Konsole,在“编辑”菜单中,有一个“发送信号”子菜单,我可以在其中发送 SIGKILL 等信号。

相关内容