我很感兴趣是否有更好的方法来执行同一 systemd 服务模板的互斥实例。
上下文:我正在使用 SSH 隧道通过我的笔记本电脑和我旁边的工作站之间的协同连接。显然,同一时间只能运行一个隧道。如果打开新隧道,则应提前关闭旧隧道的任何仍在运行的实例。
无论如何,[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]
在启动之前停止)。
它对我有用,但它很丑陋,我确信有一个“更系统化的方式“要做到这一点,我只是不知道如何做。