私アプリケーション毎日メンテナンス開始時にデータベースから読み取られます。別個のアップデータ,systemd
以下の単位で説明します。
application.service
:
[Unit]
Description=Application reading database
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target
[Service]
User=application
Group=application
WorkingDirectory=/var/lib/application
ExecStart=/var/lib/application/application-exec --database /var/db/database.db
StandardOutput=file:/var/lib/application/application.stdout.log
StandardError=file:/var/lib/application/application.stderr.log
StartLimitInterval=60
StartLimitBurst=10
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
updater.service
:
[Unit]
Description=Database updater
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target
[Service]
Type=oneshot
User=updater
Group=updater
WorkingDirectory=/var/lib/updater
ExecStart=/var/lib/updater/updater-exec --database /var/db/database.db
StandardOutput=file:/var/lib/updater/updater.stdout.log
StandardError=file:/var/lib/updater/updater.stderr.log
[Install]
WantedBy=multi-user.target
updater.timer
:
[Unit]
Description=Timer for database updater
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=900
Persistent=true
[Install]
WantedBy=timers.target
私の質問:
どうやって作れますか?アップデートサービス再起動アプリケーションサービスアップデートは正常に実行されましたか?
この問題存在するサーバー障害似ていますが、残念ながら私のユースケースに適した答えはありません。
ベストアンサー1
解決策は予想よりはるかに簡単でした。次の行を追加する必要がありますupdater.service
。
ExecStartPost=+/usr/bin/systemctl restart application.service
結果updater.service
:
[Unit]
Description=Database updater
Wants=network-online.target
After=local-fs.target network-online.target nss-lookup.target
[Service]
Type=oneshot
User=updater
Group=updater
WorkingDirectory=/var/lib/updater
ExecStart=/var/lib/updater/updater-exec --database /var/db/database.db
StandardOutput=file:/var/lib/updater/updater.stdout.log
StandardError=file:/var/lib/updater/updater.stderr.log
ExecStartPost=+/usr/bin/systemctl restart application.service
[Install]
WantedBy=multi-user.target
関連抜粋man 5 systemd.service
:
├───────┼────────────────────────────────────────┤
│"+" │ If the executable path is prefixed │
│ │ with "+" then the process is executed │
│ │ with full privileges. In this mode │
│ │ privilege restrictions configured with │
│ │ User=, Group=, CapabilityBoundingSet= │
│ │ or the various file system namespacing │
│ │ options (such as PrivateDevices=, │
│ │ PrivateTmp=) are not applied to the │
│ │ invoked command line (but still affect │
│ │ any other ExecStart=, ExecStop=, ... │
│ │ lines). │
├───────┼────────────────────────────────────────┤
ExecStartPost= commands are only run after the commands specified in ExecStart= have been invoked
successfully, as determined by Type= (i.e. the process has been started for Type=simple or Type=idle,
the last ExecStart= process exited successfully for Type=oneshot, the initial process exited
successfully for Type=forking, "READY=1" is sent for Type=notify, or the BusName= has been taken for
Type=dbus).
説明する:
ExecStartPost=
以前の理由により、コマンドはroot権限で実行されます(最初の抜粋を参照+
)application.service
。systemctl
User=
Group=
ExecStartPost=
成功した場合にのみコマンドを実行しますExecStart=
(2番目の抜粋を参照)。これにより、条件付き再始動が許可されます。application.service