システムサービスに他のサービスを再起動させる方法は?

システムサービスに他のサービスを再起動させる方法は?

アプリケーション毎日メンテナンス開始時にデータベースから読み取られます。別個のアップデータ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.servicesystemctlUser=Group=
  • ExecStartPost=成功した場合にのみコマンドを実行しますExecStart=(2番目の抜粋を参照)。これにより、条件付き再始動が許可されます。application.service

おすすめ記事