web-dev-qa-db-ja.com

systemdサービスがネットワークを待機していないのはなぜですか?

this の質問とその回答ごとに、サービスファイルに以下を追加しました。

Wants=network-online.target
After=docker.service network.target network-online.target

私も実行しました:

systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service

それでも、git pull Origin masterを使用するExecStartPreタスクは、接続の問題のように見えるために失敗します。

Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.

明らかなものがないのですか? git pullを使用するために待つ必要がある別のサービスはありますか? (関連がある場合、私はUbuntu 16.10とsystemd 231を使用しています。)

10
pdoherty926

最初のステップは、NetworkManagerまたはsystemd-networkdを使用しているかどうかを判別することです。使用しているものに対してwait-onlineを有効にします(この例ではsystemd-networkdと仮定します):

systemctl enable systemd-networkd-wait-online.service

wait-onlineサービスの後にサービスを開始してください:

[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

(requiresはwantsのより厳密なバリアントです。この場合、ハードな依存関係が必要なようです)。

これにより、ネットワークが保証された後にサービスが開始されます。


代わりに(または前のソリューションと組み合わせて)、Restart=フラグを使用して、失敗したときにサービスを再起動するように構成できます。

[Unit]
...
Restart=on-failure
RestartSec=5

https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart=

起動が遅くならないので、これはより良い方法かもしれません( https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/#cutthecraphowdoimakenetwork.targetworkforme -wait-onlineを使用するは起動時間を大幅に遅くする可能性があります)が、サービスが失敗した場合のサービスの動作が心配な場合は、オプション1またはその両方を使用してください。

6
Centimane