我想将脚本中的 SysV 服务迁移到 systemd 中的单元文件中。我有两台机器,一台主机,一台副机。在两台机器上,该服务将在启动时启用,但该服务将始终在主机器上运行。我想添加一个 ExecCondition,以验证另一台计算机上的服务状态,并根据此继续执行以下命令或直接不执行任何操作。
systemctl is-active myservice -H kbc01
该命令显示活动或非活动状态
active (0)
inactive (3)
我的想法是,如果另一台计算机中的服务处于活动状态(0),则不会执行以下 ExecStart 命令。如果另一台计算机上的服务已关闭 (3),请运行以下 Execstart 命令。
systemd 文档说以下 ExecCondition= 命令退出,退出代码为 1 到 254(含),其余命令将被跳过,并且该单元不会被标记为失败。
我怎样才能让它做相反的事情?
主机(kbc01):
[Unit]
Description=Aplication
After=local-fs.target network-online.target
[Service]
ExecCondition=systemctl is-active myservice -H kbc01
ExecStart=/home/user/aplication/bin/myservicestart
ExecStop=/home/user/aplication/bin/myserviceshutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
辅助机器(kbc02):
[Unit]
Description=Aplication
After=local-fs.target network-online.target
[Service]
ExecCondition=systemctl is-active myservice -H kbc02
ExecStart=/home/user/aplication/bin/myservicestart
ExecStop=/home/user/aplication/bin/myserviceshutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
答案1
systemctl is-active
您可以使用您的逻辑调用 bash 脚本,而不是直接调用:
[Service]
ExecCondition=/usr/local/sbin/myservice-is-needed kbc02
#!/bin/bash
# /usr/local/sbin/myservice-is-needed
systemctl is-active myservice -H "$1"
retval=$?
if [ "$retval" -ne 0 ]; then
exit 0;
fi
exit 1
或者将其设为 1-liner:
[Service]
ExecCondition=/bin/bash -c '! systemctl is-active myservice -H kbc02'