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

关闭bash终端时,如何终止进程?,bash,terminal,process,kill-process,Bash,Terminal,Process,Kill Process,我发现了许多方法,可以在关闭bash终端后在后台保持进程运行。但是,我怎么能做相反的事情呢?当终端关闭时,如何终止后台进程 当前,当我关闭终端时,我会得到“进程正在会话中运行…是否仍要关闭?”如果我点击OK,终端将关闭,但进程不会被终止并停留。我可以把这些进程的抑制与终端进程的“死亡”挂钩吗 简单示例:运行ssh代理bash,然后尝试关闭终端。将其放入。bashrc: trap 'kill $(ps -o pid= --ppid $$) 2>/dev/null' exit 此命令将使sh

我发现了许多方法,可以在关闭bash终端后在后台保持进程运行。但是,我怎么能做相反的事情呢?当终端关闭时,如何终止后台进程

当前,当我关闭终端时,我会得到“进程正在会话中运行…是否仍要关闭?”如果我点击OK,终端将关闭,但进程不会被终止并停留。我可以把这些进程的抑制与终端进程的“死亡”挂钩吗


简单示例:运行
ssh代理bash
,然后尝试关闭终端。

将其放入
。bashrc

trap 'kill $(ps -o pid= --ppid $$) 2>/dev/null' exit
此命令将使shell在退出时杀死其所有子进程


说明:
trap
命令捕获信号和其他事件,并允许您执行在捕获信号或事件发生时运行的命令

trap [-lp] [[arg] signal_spec ...]
ARG是shell接收到信号_SPEC时要读取和执行的命令。如果信号_SPEC是EXIT,则ARG在退出shell时执行


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

kill [-s sigspec | -n signum | -sigspec] pid ...
如果SIGSPEC和SIGNUM均不存在,则假定为SIGTERM(终止信号)


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

-o格式
用户定义的输出格式。
--ppid pidlist
选择要通过其父进程的PID显示的进程。选择进程
这些是PIDLIST中列出的子项。

最后,shell中的
$
扩展为shell的进程id。在
$(…)
子shell中,它扩展到当前shell的进程ID,而不是子shell


2>/dev/null
用于丢弃kill命令的潜在错误输出,该错误输出可能是由执行kill命令时不再存在,但在执行ps命令时存在的进程引起的-通常是子shell
$(…)
将其放入
中。bashrc

trap 'kill $(ps -o pid= --ppid $$) 2>/dev/null' exit
此命令将使shell在退出时杀死其所有子进程


说明:
trap
命令捕获信号和其他事件,并允许您执行在捕获信号或事件发生时运行的命令

trap [-lp] [[arg] signal_spec ...]
ARG是shell接收到信号_SPEC时要读取和执行的命令。如果信号_SPEC是EXIT,则ARG在退出shell时执行


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

kill [-s sigspec | -n signum | -sigspec] pid ...
如果SIGSPEC和SIGNUM均不存在,则假定为SIGTERM(终止信号)


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

-o格式
用户定义的输出格式。
--ppid pidlist
选择要通过其父进程的PID显示的进程。选择进程
这些是PIDLIST中列出的子项。

最后,shell中的
$
扩展为shell的进程id。在
$(…)
子shell中,它扩展到当前shell的进程ID,而不是子shell


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

这对我不起作用。在使用
ssh代理bash
进行测试时,我尝试将此行添加到
.bashrc
,然后尝试将其添加到
.profile
,但当我关闭终端时,ssh代理仍在运行。如果我从
.profile
运行
ssh-agent bash
,这行代码是否有效?或者这是否会改变什么?看起来
ssh-agent
有时需要几秒钟来停止其活动。当我打开新终端时,键入
ssh-agent bash
并关闭终端窗口,然后执行
pgrep-a ssh-agent
,直到我可以看到ssh-agent命令在几秒钟后关闭。但是,在这种情况下,您甚至不需要陷阱,因为此ssh代理命令在前台运行,并在您关闭终端时退出。要在后台进程上尝试陷阱命令,您可以尝试
ssh agent sleep 1000&
,然后关闭终端。该进程随后被终止,又花了几秒钟的时间。最终,通过一些摆弄和
ssh代理-k
使其工作,但这对我来说不起作用。在使用
ssh代理bash
进行测试时,我尝试将此行添加到
.bashrc
,然后尝试将其添加到
.profile
,但当我关闭终端时,ssh代理仍在运行。如果我从
.profile
运行
ssh-agent bash
,这行代码是否有效?或者这是否会改变什么?看起来
ssh-agent
有时需要几秒钟来停止其活动。当我打开新终端时,键入
ssh-agent bash
并关闭终端窗口,然后执行
pgrep-a ssh-agent
,直到我可以看到ssh-agent命令在几秒钟后关闭。但是,在这种情况下,您甚至不需要陷阱,因为此ssh代理命令在前台运行,并在您关闭终端时退出。要在后台进程上尝试陷阱命令,您可以尝试
ssh agent sleep 1000&
,然后关闭终端。该进程随后被终止,再次需要几秒钟的时间。最终通过一些修改和
ssh代理-k