我想修改已安装的 Flatpak 的运行方式,以便podman
Flatpak 使用的容器在 Flatpak 运行之前运行(最好在 Flatpak 完成运行后关闭,但这是可选的)。这样做的目的是节省资源——podman
容器不需要一直运行。
例如,我想explainshell
在 VSCode 启动时启动一个容器。
要涵盖从命令行运行 Flatpaks 的情况,很简单 - 我可以只alias
flatpak
使用一个flatpak-wrapper
脚本,然后在该flatpak-wrapper
脚本中拦截flatpak run
我关心的调用,podman run
在必要时运行命令,然后运行原始请求flatpak run
命令。
然而,.desktop
通过 flatpak 安装的文件比较棘手,因为它们包含硬编码的/usr/bin/flatpak
调用,这显然不受 shell 别名的影响。我可以.desktop
通过 KDE UI 轻松地逐一编辑这些文件,但如果我想编写此编辑脚本怎么办?
我想我需要的是:
- 一种查找
.desktop
给定 Flatpak 的已安装文件的方法,以便我可以使用 bash 脚本编辑它们 .desktop
即使在 Flatpak 升级更改文件后,也可以使我对此类文件的编辑保持不变.desktop
- 无需用户执行任何手动步骤
(假设我无法使用套接字激活,因为 podman 容器不支持它。)
对我的 dbus 会话总线的一点监视揭示了与 vscodium Flatpak 容器相关的大量流量。但经过一番谷歌搜索后,我了解到,如果 systemd 正在运行(这对我来说是这样),任何Flatpak 容器都会在启动时向 systemd 发送一条消息,这意味着我们可以使用 systemd 配置文件来配置所需的自动启动行为。
这就是我所做的。此解决方案说明了创建 systemd 配置文件的两种可能方法:
.d
- 这更适合脚本创建,因为这样它们可以使用不会与任何其他脚本冲突的唯一文件名。.service
为 podman 容器生成 systemd文件。我们将重新启动策略设置为“否”,因为稍后我们的 Uphold 将负责重新启动它。我使用它是
tee
为了在安装之前可以查看它,因为我是在命令提示符下手动执行此操作的。在脚本中,这不是必需的。让我们删除启动时自动启动的行为:
并删除重新启动配置,因为
Upholds
下面应该处理这个问题:看起来不错 - 让我们安装它:
并添加依赖关系 - 我使用bustle找到了范围:
最后,让 systemd 知道我们的新配置文件:
好的,这可行,但容器在 vscodium 退出后仍然存在:
事实上,vscodium 还没有完全消亡。有一些僵尸进程和一些其他进程仍然存在。奇怪的。让我们杀掉他们吧:
但explainshell容器仍然存在:
为了尝试解决这个问题,我尝试添加
到
my-ublue.conf
. 然而,不幸的是,Flatpak 创建的初始作用域是暂时的,因此它会停止并立即导致explainshell 容器也停止。所以我无法让容器自动关闭,但这是一个可选要求。