Armadilloフォーラム

ネットワークが有効になるまで待つ

ykawashima

2018年6月27日 18時13分

お世話になります、川島です。

rc.localから自作のプログラムを起動するシェルスクリプトを呼んでいるのですが、
これで呼ばれたタイミングではネットワーク接続が有効になっておらず、シェルスクリプト内の
ntpdateコマンド等が失敗してしまいます。

そこでスクリプトの中でネットワーク接続が有効になるのを待つか、ネットワーク接続が有効になってから
このスクリプトを呼ぶようにしたいのですが、どのような方法が考えられますでしょうか。

現在ネットワークにはeth0で接続していますが、実際にはwifi又はlteでの接続が想定される為、
デバイスレベルではなくサービスレベルでのチェックが望ましいです。

以上、宜しくお願いします。

コメント

at_keita.mogaki

2018年6月28日 17時50分

茂垣です。

まず、以下の内容を確認して頂けますでしょうか。

1.自作のプログラムを自動実行する場合は、rc.localではなくSystemdのUnitファイルを作成する方法が良いかと思います。
  詳しくは以下のブログを参照してください。
  https://users.atmark-techno.com/blog/6938/2865
2.lte、wlanは切断・接続を繰り返す事があるため、ネットワークインターフェスが有効になった後でも自作のプログラムの起動に
  失敗する可能性があります。そのため、ネットワークとの接続が成功するまでコマンドを繰り返し実行するなど、
  ネットワーク切断時の対策を自作のプログラム内に入れる事をおすすめ致します。
3.ntpdateコマンドは、ネットワークがupした時に実行されます。
  そのため、タイミングに問題が無ければ、自作のプログラム内でntpdateコマンドを実行しなくても良いかもしれません。
  https://armadillo.atmark-techno.com/forum/armadillo/2692#comment-4399

こちらを前提としたうえで、次の方法を提示させて頂きます。

■SystemdのUnitファイルを作成し、起動順序を持たせて自作のプログラムを起動させる方法
この方法を用いると、任意のserviceが終了した後に、自作のプログラムを起動させるよう設定する事ができます。

デフォルトで無効になっているsystemd-networkd(※1)とsystemd-networkd-wait-online(※2)を有効にして、
システム起動時、ネットワークインターフェスが有効になった後に、自作のプログラムを起動させるようにすれば、
本件の内容に沿った動作をするかと思います。

以下に手順を記載します。

こちらのブログを参考に、自作のプログラムのUnitファイルを作成し、Systemdで自動起動させます。
https://users.atmark-techno.com/blog/6938/2865
プログラム名やservice名などは、自作のプログラム名に合わせて修正してください。

その際、「3.Unitファイルの作成」のUnitファイルを以下のように修正します。

[Unit]
Description = system_init_test daemon
After = systemd-networkd-wait-online.service #追加します。
 
[Service]
ExecStart = /root/system_init_test.sh
Restart = always
Type = simple
 
[Install]
WantedBy = multi-user.target

systemd-networkdとsystemd-networkd-wait-onlineを有効にします。

root@armadillo:~# systemctl enable systemd-networkd
root@armadillo:~# systemctl enable systemd-networkd-wait-online

ブログの手順通りに作業を進め、Armadilloを再起動します。

これで、ネットワークインターフェスが有効になった後に、
自作のプログラムを起動させることができます。

注意点
 この設定を行う事で、他のプログラムの起動が遅くなるなどの影響が出る可能性があります。
 Unitファイルの作成は、他のプログラムと自作のプログラムの依存関係や起動順序に注意してください。

(※1)systemd-networkdは、ネットワークを管理するシステムサービスです。ネットワークデバイスを検出して設定し、仮想ネットワークデバイスを作成します。
(※2)systemd-networkd-wait-online.serviceは、systemd-networkd.serviceによって管理されている、ネットワークの設定を待つシステムサービスです。ワンショットシステムサービスで、少なくとも1つのリンクが通信事業者を獲得するまで待機します。

ご確認の程、よろしくお願い致します。

ykawashima

2018年6月29日 10時52分

川島です。

茂垣 様

大変有用な情報ありがとうございます。早速試させて頂きます。

oshiro

2021年1月6日 20時01分

こちらのG3の環境では、うまく行きませんでしたが、下記でうまくいきました。

[Unit]
Description=user program
Wants=network-online.target
After=network-online.target
 
[Service]
ExecStart=/root/program
Restart=no
Type=simple
 
[Install]
WantedBy=multi-user.target

(色々やっていたので確証ないですが、Wantsが無いと、上手く行かないような感じでした。)

うまくいったかどうかは、下記コマンドで生成されたファイルを、ブラウザで開くと分かりやすかったです。

systemd-analyze plot > plot.svg

また、下記はなくても、行けました。
systemctl enable systemd-networkd
systemctl enable systemd-networkd-wait-online