以前掲載しました「Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その2)〜起動順序を設定する〜」を応用し、ネットワーク接続後にアプリを起動させる方法をご紹介します。
systemdの詳細は「Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その1)」(以下その1と記載)を参照してください。
1.はじめに
systemdで「ネットワークを経由した動作を行う」自作アプリを起動させたい場合、必ず「ネットワーク接続が完了してから、自作アプリが起動する」流れを作成したいと思われます。
そのため、systemdで自作アプリを実行する前にネットワーク接続を確認する必要があります。
今回の例ではネットワーク接続を確認する方法として、サービスの[systemd-networkd]と[systemd-networkd-wait-online]を使用します。
各サービスの説明を以下に記載します。
サービス名 | 説明 |
---|---|
systemd-networkd | ネットワークを管理するシステムサービス ネットワークデバイスを検出,設定し、仮想ネットワークデバイスを作成する | systemd-networkd-wait-online.service | ネットワークの設定を待つシステムサービス systemd-networkd.serviceによって管理されている ワンショットシステムサービスで、以下のどちらかになるまで待つ ・使用できるすべてのネットワークデバイスが接続失敗 ・いずれか1つのネットワークデバイスが接続済み |
2.自作アプリの作成と必要サービスの有効化
自作アプリ[systemd_network_check.sh]とUnitファイル[systemd_network_check.service]を作成し、必要サービス[systemd-networkd],[systemd-networkd-wait-online]を有効にします。
2-1.起動するアプリの作成
まずネットワークを使用するテストアプリを作成します。
今回は「ネットワーク接続ができているかを[ping]コマンドで確認し、その結果をテキストに保存する」スクリプトでテストを行います。
[armadillo]$ vi systemd_network_check.sh
スクリプトの内容は以下のようにします。
#!/bin/bash
ping 8.8.8.8 -c 1 >> /dev/null
if [ $? = 0 ]; then
echo "ping test success!" >> /tmp/systemd_ping_test.log
else
echo "ping test failed..." >> /tmp/systemd_ping_test.log
fi
作成したシェルスクリプトに実行権限を与えます。
[armadillo]$ chmod +x systemd_network_check.sh
2-2.Unitファイルの作成
[systemd_network_check.sh]に関連付いたUnitファイル[systemd_network_check.service]を作成します。
Unitファイルの詳細はsystemd同様に「その1」を参照してください。
[armadillo]$ vi /etc/systemd/system/systemd_network_check.service
Unitファイルの内容は以下のようにします。
[Unit]
Description = systemd_network_check daemon
After = systemd-networkd-wait-online.service
[Service]
ExecStart = /root/systemd_network_check.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
2-3.必要サービスの有効化
必要サービス[systemd-networkd],[systemd-networkd-wait-online]を有効にします。
[armadillo]$ systemctl enable systemd-networkd
[armadillo]$ systemctl enable systemd-networkd-wait-online
3.Unitファイルの自動起動設定
必要サービスの有効化完了後、Unitファイルの自動起動設定を行います。
・Unitリストに追加したsystemd_network_check.serviceが追加されている事を確認します。
[armadillo]$ systemctl list-unit-files | grep systemd_network_check
systemd_network_check.service disabled
・systemd_network_check.serviceの自動起動を有効にします。
[armadillo]$ systemctl enable systemd_network_check.service
Created symlink from /etc/systemd/system/multi-user.target.wants/systemd_network_check.service to /etc/systemd/system/systemd_network_check.service.
・before_test.serviceの自動起動が有効になったことを確認します。
[armadillo]$ systemctl list-unit-files | grep systemd_network_check
systemd_network_check.service enabled
4.実際の動作確認
実際に正しい起動順序でUnitが起動されるか確認するために、Armadilloを再起動します。
[armadillo]$ reboot
Armadillo再起動完了後、自作アプリが保存したログを確認します。
以下のように[ping test success!]と保存されていれば、ネットワーク接続後に[ping]コマンドが実行され、成功していることがわかります。
[armadillo]$ cat /tmp/systemd_ping_test.log
ping test success!
ping test success!
ping test success!
ping test success!
ping test success!