首页 > 解决方案 > 关闭 bash 终端时如何终止进程?

问题描述

在关闭 bash 终端后,我找到了许多方法来保持进程在后台运行。但是,我该怎么做相反的事情呢?终端关闭时如何终止后台进程?

目前,当我关闭终端时,我得到“进程正在会话中运行......仍然关闭?” 如果我点击确定,终端会关闭,但进程不会被杀死并徘徊。我可以将这些进程的抑制与终端进程的“死亡”挂钩吗?

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

标签: bashterminalprocesskill-process

解决方案


把它放在你的.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。在$(...)子shell 中,它扩展为当前shell 的进程ID,而不是子shell。

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


推荐阅读