OpenWrtでサービスをサクッと作る
公式サイト参考資料や、既存のinitスクリプトを見れば、大体わかります。
iperf3 をサンプルに、起動してみました。
iperf3 はそれ自体が fork/exec の機能を持っていて daemon 起動するので簡単ですね。
iperf3 の daemon起動
iperf3 -s --daemon
これに後で終了しやすいようにオプションを入れてあげます。
iperf3 -s --daemon --pidfile /path/to/pid -B 192.168.1.1
あとは、これを使って pidファイルから PIDを取得して終了すればいいわけです。
/etc/init.d/iperf3
サクッと作ると、次のようになります。
#!/bin/sh /etc/rc.common START=95 STOP=01 pidfile=/var/run/iperf3.pid ip=192.168.1.1 start(){ echo start iperf3 echo iperf3 --server --daemon --pidfile $pidfile --bind $ip echo iperf3 --server --daemon --pidfile $pidfile --bind $ip } stop() { echo stop iperf3 if [ -e $pidfile ] ; then pid=`cat $pidfile` kill $pid fi }
shebang
1行目のshebanが特殊です。ここでこれを指定すると start/stop 関数をサービス起動終了に使ってくれます。
#!/bin/sh /etc/rc.common
START/STOP
ここは少しわかりにくいですが、いにしえの手法 /etc/rc.dを知っているとサクッとわかります。
START=95 STOP=01
START=95を指定すると/etc/rc.d/S95iperf3
が作成されます。
STOP=01を指定すると/etc/rc.d/K01iperf3
が作成されます。
/etc/rc.dよって、開始時の呼順、終了時の呼順を制御しています。辞書順です。
起動終了のテスト
作ったスクリプトを /etc/init.dに設置したら使えます。
ln -s /root/iperf3-service /etc/init.d/iperf3
起動してみます。
# service iperf3 start
起動を確認します
# ps w | grep iperf3
終了します。
# service iperf3 stop
終了を確認します。
# ps w | grep iperf3
enable で有効にする
作ったサービスをenableにすれば、サービスが有効になります。
# service iperf3 enable
起動時実効有効になったのを確認する。 /etc/rc.d/S95 が作成される
root@OpenWrt:~# ls -la /etc/rc.d/S* | grep iperf lrwxrwxrwx 1 root root 16 Feb 19 17:58 /etc/rc.d/S95iperf3 -> ../init.d/iperf3
終了時の実効が有効になったのを確認する。 /etc/rc.d/K01 が作成される
root@OpenWrt:~# ls -la /etc/rc.d/K* | grep iperf lrwxrwxrwx 1 root root 16 Feb 19 17:58 /etc/rc.d/K01iperf3 -> ../init.d/iperf3
起動時と終了時で順番が違うのは、起動時では最後に、終了時には最初に、それぞれ処理をしてほしいからです。
有効になったのを確認する。
ここまでで、WEB-UI/Luciから有効になったのが確認できます。
永続化する。
/etc/init.d のファイルは、バックアップに含まれないので、バージョンアップ時に消えてしまいます。
mv /etc/init.d/iperf3 /etc/config/my_custom/services/iperf3-service ln -s /etc/config/my_custom/services/iperf3-service /etc/init.d/iperf3
/etc/config はバックアップに含まれるので、これでファイルがバックアップに入ります。
ただ、バックアップからの復元時に /etc/init.dへ自動に書き戻す事はできないので、注意が必要です。どうしてもやりたければ、opkg のパッケージを作ったほうがいいかもしれない。
参考資料にある USE_PROCDについて
USE_PROCD=1
USE_PROCDを使ったほうが、daemon化が必要ないので便利そうですが。 iperf3にはdaemon機能があるので、今回は使っていません。
参考資料
https://openwrt.org/docs/guide-developer/procd-init-script-example