私はPostgresデータベースを使用するプログラムを作成し、そのためのシステムサービスファイルを作成しました。現在、私のサービスは起動時に正しく開始され、apt upgrade
Postgresがアップグレードを停止すると停止します。ただし、アップグレードが完了してPostgresが再起動された場合、私のサービスは自動的に起動しません。
サービスを自動的に再起動するようにいくつかの依存関係を定義できますか?
Postgresのアップグレード中にサービスが自動的に停止した後のサービスの状態は次のとおりです。
● tabill.service - My service
Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
Main PID: 1048 (code=killed, signal=TERM)
サービスを手動で再起動できます。
これは私のサービスファイルです。
[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service
[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60
[Install]
WantedBy=multi-user.target
PartOf=postgresql.service
Postgresを追加して手動で停止して起動しようとしましたが、BindsTo=postgresql.service
どちらも役に立ちませんでした。
もちろん、削除することもできますがRequires
、両方を再起動できる場合は、両方のサービスを停止する方が良いでしょう。
答え1
答えを見つけました。サービスファイルの最後の行を次のように変更する必要がありました。
WantedBy=postgresql.service
これにより、Postgresが起動するたびに私のサービスも開始されます。ただし、サービスが失敗してもPostgresは停止しません。
このセクションの説明は、[Install]
デバイスの有効化と無効化にのみ影響します。しかし、私のサービスがすでに有効になっている場合、状況はそれほど単純ではありません。
# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links
このエラーメッセージは誤解を招く可能性があります。問題を解決するのは簡単です。
# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.
# systemctl enable tabill.service
Failed to execute operation: No such file or directory
# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.
Postgresが起動するたびに、私のサービスは停止して起動します。もちろん、Postgresはシステムが起動したときに始まります。