如何以编程方式停止/禁用所有与特定变量不匹配的模板化 systemd 服务?例如,我正在运行myservice@v1
,我想停止/禁用与以下变量不匹配的服务myservice@*
除了为了myservice@v1
。
这是我所见过最接近的,但是list-units
它给出的输出显然不适合机器解析,因此很脆弱:
export SERVICES="$(systemctl list-units myservice@* --all | \
grep myservice | grep -v "@v1" | cut -f1 -d' ')"
if [ -n "$SERVICES" ]; then
/bin/systemctl stop $SERVICES
/bin/systemctl disable $SERVICES
fi
答案1
添加--no-legend
到systemctl
命令中以删除一些您不需要的无用垃圾。然后它将仅列出单位,没有页眉或页脚。
我还建议您收紧grep
。就目前情况而言,它将匹配v10
以及v1
,仅举个例子。您可以通过添加-w
单词匹配来实现这一点,或者通过更具体地匹配,例如@v1.service