同一 systemd 服务模板的互斥实例

同一 systemd 服务模板的互斥实例

我很感兴趣是否有更好的方法来执行同一 systemd 服务模板的互斥实例。

上下文:我正在使用 SSH 隧道通过我的笔记本电脑和我旁边的工作站之间的协同连接。显然,同一时间只能运行一个隧道。如果打开新隧道,则应提前关闭旧隧道的任何仍在运行的实例。

(这与该用户使用 VPN 服务模板实例的用例类型

无论如何,[email protected]规则似乎对我没有帮助,即使 systemd 正确地从冲突列表中删除当前实例([email protected]自动从自身Conflicts=列表中删除[email protected]),它似乎也没有达到预期的结果([email protected]在启动之前不会自动停止) [email protected])。

目前,它对我使用这个可怕的装置有效:

ExecStartPre=-/bin/sh -c 'systemctl --user stop  $$(systemctl --user list-units %p@\'*\'.service|gawk \'($$3~/^activ/)&&(!($$1~/%I/)){print $$1};\')'
ExecStart=/usr/bin/autossh -M 11111 -N -L24800:localhost:24800 %I

这用于list-units获取此服务 remplate 的所有实例的列表(将返回[email protected], [email protected]),并使用 gawk 来过滤那些处于活动状态和不是当前实例的实例,并且仅停止这些实例(因此启动[email protected][email protected]在启动之前停止)。

它对我有用,但它很丑陋,我确信有一个“更系统化的方式“要做到这一点,我只是不知道如何做。

相关内容