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の起動時間や起動順序が表示されます。