systemdサービスマニュアルを何度も読みましたが、まだデフォルトのsystemdモードを把握できません。
起動時に起動プロセス(Dockerコンテナやドライブフォーマットなど)を一度実行し、正常に完了したいと思います。ただし、これにType = oneshotを使用するとRestart = on-failureは使用できず、失敗した場合は操作を再試行しません。ここで明らかなものを見逃していますか?
また、Restart = on-failureを使用してType = simpleを設定しようとしましたが、多くの場合、マンページのワンショットサービスが提供する次の動作が必要です。
oneshotは単に動作しますが、systemdが後続のユニットを起動する前にプロセスを終了する必要があります。
修正する:
ベストアンサー1
私が試している1つの可能な回避策は次のとおりです。
[Unit]
Description=Tags instance and EBS vols
After=docker.service
Requires=docker.service
[Service]
ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
Restart=on-failure
RestartSec=30
スクリプトの実行が終了する場所ですtag.sh
。touch /ack/TAG_SUCCESS
私はこれが望む動作に非常に近いと思います。ExecStartPre
実行は順番に行われ、呼び出す前に成功した完了を待ちExecStart
、ユニットはStarting
一度だけ考慮されExecStart
、この時点で私たちは開始タスクを完了したと確信しています。
しかし、それでも巨大なハッキングのように感じますか?