如何在关闭 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 $(...)
.
我发现了很多方法可以在 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.
退出时执行 ARGkill
命令向作为参数提供的 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 $(...)
.