bash - 关闭 bash 终端时如何终止进程?
问题描述
在关闭 bash 终端后,我找到了许多方法来保持进程在后台运行。但是,我该怎么做相反的事情呢?终端关闭时如何终止后台进程?
目前,当我关闭终端时,我得到“进程正在会话中运行......仍然关闭?” 如果我点击确定,终端会关闭,但进程不会被杀死并徘徊。我可以将这些进程的抑制与终端进程的“死亡”挂钩吗?
简单的例子:运行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。在$(...)
子shell 中,它扩展为当前shell 的进程ID,而不是子shell。
并且2>/dev/null
用于丢弃 kill 命令的潜在错误输出,这可能是由执行 kill 命令时不再存在但在执行 ps 命令时存在的进程引起的 - 通常是 subshell $(...)
。
推荐阅读
- api - 当我尝试集成谷歌地图时,出现错误
- c - 如果该标头已被隐式包含,是否应将标头包含在文件中?
- postgresql - 如何从 docker 容器中删除初始化脚本
- scala - Kleisli 如何是一个单子变压器?
- pandas - 如果一组行不满足条件,如何删除它们?
- applescript - AppleScript - 从磁盘读取的数组为空
- react-native - React Native FlexBox & Wrap - 如何检测元素是否移动到下一行?
- docker - Jenkins docker slave 配置错误:SSH 服务在 43 秒后没有启动
- r - 变量“中”的无效类型(列表)和值不是唯一标识的
- javascript - Reactjs 中获取错误处理的问题