systemdサービスファイル:タイプ=ワンショットサービスは再起動できません=失敗しました。

systemdサービスファイル:タイプ=ワンショットサービスは再起動できません=失敗しました。

成功するまで再試行する必要がある2つのrsyncコマンドを順番に実行するためのsystemdサービスファイルを作成しました。時々 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=コマンドの前に付けます。-

答え2

たとえば、両方のサービスAとBを試してみることができます。ここで、BはAに依存し、Aはワンタイムサービスです。

次の例に示す設定を使用すると、マルチユーザーの目標(または[インストール]セクションで指定した他の目標)に達すると、サービスBが開始されます。サービスBはサービスAに依存し、サービスAの後に開始するように設定されているため、サービスAの前に開始されません。また、サービスAはoneshotタイプなので、サービスBはサービスAが終了するのを待ちます。

サービスAはサービスBに必要であるため、サービスAが失敗した場合、サービスBは開始されません。サービス B が失敗すると再起動します。デフォルト設定では、systemdが追加の再起動試行を停止する前に許可される失敗した再起動試行の数(指定された間隔内)に制限があります。

私。サービス

[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

サービス

[Unit]
Description=Sync Task A Service

[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -atvzq --no-owner --no-group --delete rsync://(some address) /srv/www/

関連情報