我创建了一个 systemd 服务文件来顺序运行两个 rsync 命令,我需要重试直到成功。有时 rsync 服务器会关闭。 Systemd 告诉我 Type=oneshot 服务不允许 Restart=on-failure。我还可以使用什么其他类型的服务?
[Unit]
Description=Sync
[Service]
Type=oneshot
Restart=on-failure
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www1/
答案1
我假设你只是使用Type=oneshot
这样你可以有几个ExecStart=
命令。除此之外,没有理由使用,Type=oneshot
因为您似乎没有成功激活后触发的服务,并且您没有使用RemainAfterExit=true
相反,使用Type=simple
和使用ExecStartPre=
[Service]
Type=simple
Restart=on-failure
ExecStartPre=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www1/
将会发生以下情况:
ExecStartPre=
将在命令之前运行ExecStart=
。- 执行期间
ExecStartPre=
,该单元将“激活” - 如果
ExecStartPre=
失败,ExecStart=
将不会运行,设备将被视为“失败”并将重新启动。 - 执行期间
ExecStart=
,该单元将被“激活” - 完成后
ExecStart=
,如果一切成功,该单元将“不活动(死亡)”;如果任一命令不成功,该单元将“失败”。
如果要忽略失败ExecStartPre=
并强制ExecStart=
运行,请在ExecStartPre=
命令前加上 a 前缀-
以忽略非零退出代码。
答案2
例如,您可以尝试使用两个服务 A 和 B,其中 B 依赖于 A,而 A 是一次性服务。
通过下面示例中所示的设置,当达到多用户目标(或您在 [Install] 部分中指定的任何其他目标)时,将拉入服务 B。服务 B 不会在服务 A 之前启动,因为它依赖于服务 A,并且设置为在服务 A 之后启动。此外,由于服务 A 类型为 oneshot,服务 B 将等待服务 A 终止。
由于服务 A 是服务 B 所必需的,因此如果服务 A 失败,服务 B 将无法启动。如果服务 B 失败,它将重新启动。请注意,默认设置对 systemd 停止任何进一步的重新启动尝试之前允许的不成功重新启动尝试(在给定时间间隔内)的次数进行了限制。
B、服务
[Unit]
Description=Sync Task B Service
Requisite=A.service
After=A.service
[Service]
Type=simple
Restart=on-failure
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/
[Install]
WantedBy=multi-user.target
A.服务
[Unit]
Description=Sync Task A Service
[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/