依存関係がアップグレードされたときにsystemdサービスを再起動する方法


11

Postgresデータベースを使用するプログラムを作成し、そのためのsystemdサービスファイルを作成しました。現在、私のサービスは起動時に正常に開始され、Postgresがアップグレードのために停止されると(によりapt upgrade)停止されます。ただし、アップグレードが完了して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からBindsTo=postgresql.service手動でPostgresを停止して起動しようとしましたが、どちらも役に立ちませんでした。

もちろん、を削除するRequiresこともできますが、両方が再開する場合は、両方のサービスを一緒に停止することをお勧めします。


PartOf=適切なソリューションのように聞こえます。Requires=取り外して試してみましたか?
あの

@meuh削除して試してみRequires=ましたが、役に立ちませんでした。問題はPartOf=「ユニットの停止と再起動」のリンクにあると思いますが、Postgresはアップグレード中に再起動されません。停止、アップグレード、および開始されます。
Rennex 2017

おかしなことにsystemctl restart postgresql、そうすると、systemdは依存するサービスを再び再開することを覚えています。何らかの理由でstop、のstart代わりにの代わりにaptを行うように思われrestartます。
WGH 2018年

回答:


13

私は答えを見つけました:サービスファイルの最後の行を次のように変更する必要があります:

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が起動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.