ブログ

Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その3)〜並列処理の実現〜

at_syunya.ohshio
2017年11月27日 12時58分

systemdで起動タイミングを変更し、自作アプリの並列処理を実現する方法を紹介します。 systemd,Unitファイルについては「Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その1)」を参照してください。

1.はじめに

アプリの起動タイミングは、Unitファイルの[Service]セクションにある「Type」の値を変更することで切り替えることができます。 「Armadillo-X1, Armadillo-IoT G3/G3L: systemdでアプリを自動起動する方法(その2)」(以下その2と記載)では「1つ目のアプリ[before_test.service]が起動し、処理が完全に終了してから次のアプリ[system_init_test.service]が起動する」という「逐次処理」となるように設定しました。 今回は「[before_test.service]が起動した直後に[system_init_test.service]を起動させる」という「並列処理」となる設定方法を紹介します。

なお本記事は「その2」の内容を実行済みであることを前提としています。

2.テストアプリの内容修正と動作確認

並列処理ができているか確認するための前準備として、[before_test.service]の内容修正とその動作確認を行います。

2-1.テストアプリの内容修正

[before_test.service]の内容を以下に変更します。 この修正によりArmadilloは起動後、「[before_test.service]がログへ文字列を書き込み、その後[system_init_test.service]が1秒毎にログへ文字列を書き込む」という「逐次処理」動作をします。

#!/bin/bash

for i in `seq 0 4`
do
   echo before_test >> /tmp/system_init_test.log
   sleep 1
done
2-2.動作確認

動作確認を行うためArmadilloを再起動させます。

[armadillo]$ reboot

「2-1.テストアプリの修正」で説明した動作であるか、ログを確認します。

[armadillo]$ cat /tmp/system_init_test.log
before_test
before_test
before_test
before_test
before_test
system_init_test
system_init_test
system_init_test
system_init_test
system_init_test
system_init_test

このログから「[before_test.service]の処理が終わった後、[system_init_test.service]の処理が開始されている」という「逐次処理」に設定されていることが分かります。

3.起動タイミングの変更と並列処理の確認

3-1.起動タイミングの変更

「before_test.service」のUnitファイルを修正し、起動タイミングを変更します。

その2で作成した「before_test.service」を開きます。

[armadillo]$ vi /etc/systemd/system/before_test.service

[Service]セクションにある「Type」の値を変更します。

[Unit]
Description = before_test.service daemon
 
[Service]
ExecStart = /root/before_test.sh
Type = simple  #この値を"oneshot"から"simple"に変更する。
 
[Install]
WantedBy = multi-user.target
並列処理の確認

設定が変更されたかの確認を行うため、Armadilloを再起動させます。

[armadillo]$ reboot

再起動完了後、ログを確認します。

[armadillo]$ cat /tmp/system_init_test.log
before_test
system_init_test
system_init_test
before_test
system_init_test
before_test
before_test
system_init_test
system_init_test
before_test
system_init_test
system_init_test
system_init_test

このように「3.起動順序タイミングの確認」で確認した内容とは違い、[before_test.service]が起動した直後に[system_init_test.service]が起動されていることが分かります。 これは以前掲載したブログに記載したとおり、「Type = simple」は「コマンドが実行された時に起動完了となる。」という事になるため、systemdが1つ目のUnitを起動し、1つ目のUnitの完了を待たずに2つ目のUnitを起動するためこのような結果になります。

補足

systemd-analyzeコマンドを用いる事で、起動順序に関する詳細情報を画像で確認することができます。

補足-1.起動順序の詳細が確認できるsvgファイルを作成

「systemd-analyze」コマンドに「plot」オプションを付けて実行する事で、起動順序に関する情報を視覚的にわかりやすく表示できるsvgファイルを作成することができます。

[armadillo]$ systemd-analyze plot > timing_test.svg
補足-2.PCのwebブラウザでsvgファイルを表示

作成した「timing_test.svg」をPCにコピーして、webブラウザ等で開いて下さい。各Unitの起動時間や起動順序が表示されます。

関連ページ