ブログ

Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(応用編)〜ネットワーク接続後にアプリを起動〜

at_syunya.ohshio
2018年8月2日 13時27分

以前掲載しました「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!
関連ページ