如何在关闭 bash 终端时终止进程?

How can I kill a process when I close the bash terminal?

我发现了很多方法可以在 bash 终端关闭后在后台保留进程 运行ning。但是,我该怎么做呢?如何在终端关闭时终止后台进程?

目前,当我关闭终端时,我会得到 "Processes are running in session... Close anyway?",如果我点击确定,终端会关闭,但进程不会被杀死并会徘徊。能不能把这些进程的抑制和终端进程的"death"挂钩?

简单示例:运行 ssh-agent bash 然后尝试关闭终端。

将此放入您的 .bashrc:

trap 'kill $(ps -o pid= --ppid $$) 2>/dev/null' exit

此命令将使 shell 在您退出时终止其所有子进程。


解释:


trap 命令捕获信号和其他事件并让您执行命令,即 运行 当信号被捕获或事件发生时。

trap [-lp] [[arg] signal_spec ...]

ARG 是当 shell 接收到信号 SIGNAL_SPEC 时要读取和执行的命令。如果 SIGNAL_SPEC 是 EXIT,则在从 shell.

退出时执行 ARG

kill 命令向作为参数提供的 PID 的作业发送信号。

kill [-s sigspec | -n signum | -sigspec] pid ...

如果 SIGSPEC 和 SIGNUM 都不存在,则假定为 SIGTERM(终止信号)。


ps 命令显示有关进程的信息。

-o format
    User defined format of output.
--ppid pidlist
    Select which processes to show by PID of their parent process. Selects processes
    that are children of those listed in PIDLIST.

最后,shell 中的 $$ 扩展为 shell 的进程 ID。在 $(...) subshell 中,它扩展为当前 shell 的进程 ID,而不是 subshell.

2>/dev/null 用于丢弃 kill 命令的潜在错误输出,这些错误可能是由执行 kill 命令时不再存在但在执行 ps 命令时存在的进程引起的已执行 - 通常是 subshell $(...).