systemd 服务文件:Type=oneshot 服务不允许重新启动=失败

systemd 服务文件:Type=oneshot 服务不允许重新启动=失败

我创建了一个 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/

将会发生以下情况:

  1. ExecStartPre=将在命令之前运行ExecStart=
  2. 执行期间ExecStartPre=,该单元将“激活”
  3. 如果ExecStartPre=失败,ExecStart=将不会运行,设备将被视为“失败”并将重新启动。
  4. 执行期间ExecStart=,该单元将被“激活”
  5. 完成后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/

相关内容