====== カスタムアプリケーションの自動起動設定 ======
作成したアプリケーションを、MA-E3xxの電源をONしたときに自動で起動させる設定の方法です。\\
\\
===== 古典的な方法 (rc.local) =====
一般的な Linux のディストリビューション同様、Ubuntu Linux にも rc.local ファイルが用意されています。
user1@plum:~$ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
user1@plum:~$
\\
コメントの通り、マルチユーザランレベルの最後に実行されます。
user1@plum:~$ ls -l /etc/rc2.d/
total 4
-rw-r--r-- 1 root root 677 Mar 13 10:42 README
lrwxrwxrwx 1 root root 17 Mar 6 09:55 S15dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 22 Feb 18 13:53 S19cpufrequtils -> ../init.d/cpufrequtils
lrwxrwxrwx 1 root root 18 May 28 14:43 S20ddclient -> ../init.d/ddclient
lrwxrwxrwx 1 root root 15 Feb 17 14:44 S20nginx -> ../init.d/nginx
lrwxrwxrwx 1 root root 13 Feb 18 18:07 S23ntp -> ../init.d/ntp
lrwxrwxrwx 1 root root 19 Feb 18 17:53 S70dns-clean -> ../init.d/dns-clean
lrwxrwxrwx 1 root root 18 Feb 18 17:53 S70pppd-dns -> ../init.d/pppd-dns
lrwxrwxrwx 1 root root 14 Mar 14 12:39 S75sudo -> ../init.d/sudo
lrwxrwxrwx 1 root root 18 Feb 17 12:58 S99rc.local -> ../init.d/rc.local <---- このシンボリックリンク
user1@plum:~$
このファイルに作成したアプリケーションを起動する処理を記述することで実現できます。
\\
===== UpstartのJobとして定義する方法 =====
前述の rc.local による起動の場合、単に実行するだけですので下記機能がありません。
* アプリケーションの死活監視 (停止してしまった場合の再起動など)
* stop/restart/reload 等のジョブ制御
Upstart の Job にすると、上記が実現可能となります。
\\
==== 既存の Job ====
/etc/init 以下に、Upstart の Job ファイルが配置されています。
user1@plum:~$ ls /etc/init
bootmisc.sh.conf mobile_watch.conf rc.conf
butterfly.conf mountall-bootclean.sh.conf rcS.conf
checkfs.sh.conf mountall-net.conf rpcbind-boot.conf
checkroot-bootclean.sh.conf mountall-reboot.conf rpcbind.conf
checkroot.sh.conf mountall-shell.conf rsyslog.conf
console-detect.conf mountall.conf screen-cleanup.conf
console.conf mountall.sh.conf shutdown-led.conf
container-detect.conf mountdevsubfs.sh.conf shutdown.conf
control-alt-delete.conf mounted-debugfs.conf ssh.conf
cron.conf mounted-dev.conf statd-mounting.conf
dbus.conf mounted-run.conf statd.conf
disable-usb-wakeup.conf mounted-tmp.conf ttyO0.conf
dmesg.conf mounted-var.conf ttyO1.conf
export_di.conf mountkernfs.sh.conf udev-finish.conf
flush-early-job-log.conf mountnfs-bootclean.sh.conf udev.conf
gssd-mounting.conf mountnfs.sh.conf udevmonitor.conf
gssd.conf mtab.sh.conf udevtrigger.conf
hostname.conf network-interface-container.conf ufw.conf
hwclock-save.conf network-interface-security.conf upstart-file-bridge.conf
hwclock.conf network-interface.conf upstart-socket-bridge.conf
idmapd-mounting.conf networking.conf upstart-udev-bridge.conf
idmapd.conf passwd.conf usb-modeswitch-upstart.conf
initsw.conf portmap-wait.conf wait-for-state.conf
kmod.conf procps.conf zabbix-agent.conf
mgetty.conf rc-sysinit.conf zram-config.conf
user1@plum:~$
\\
MA-E3xx 用に追加・カスタムしたものは下記になります。
^ No. ^ Filename ^ Info |
| 1|butterfly.conf|Web Terminal "Butterfly"(([[mae3xx_ope:use_web_terminal:start]]))|
| 2|console-detect.conf|Consoleとして定義されているポート検出|
| 3|export\_di.conf|DI(Digital IN) GPIO を /tmp/di 以下に export|
| 4|initsw.conf|InitSW 監視|
| 5|mgetty.conf|mgetty(([[http://mgetty.greenie.net/]]))(モデム着信待受daemon)|
| 6|mobile\_watch.conf|MobileDevice(3G/LTE) アンテナレベル監視|
| 7|shutdown-led.conf|shutdown時のLED設定|
| 8|ttyO0.conf|getty (console が ttyO0 の場合)|
| 9|ttyO1.conf|getty (console が ttyO1 の場合)|
\\
==== カスタムした Job の例 ====
例として、シリアルコンソールの検出・起動を実現している console-detect.conf と ttyO0.conf(ttyO1.conf もほぼ同様) を見てみます。
description "Detect console device"
start on mounted MOUNTPOINT=/run
env consoledev
env CONSOLEDEV
emits consoledev
pre-start script
for x in $(cat /proc/cmdline); do
case $x in
console=*)
consoledev="${x#console=}"
consoledev=${consoledev%,*}
;;
esac
done
initctl emit --no-wait consoledev CONSOLEDEV=$consoledev
stop
end script
# ttyO0 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345] and (
consoledev CONSOLEDEV=ttyO0 and (
not-container or
container CONTAINER=lxc or
container CONTAINER=lxc-libvirt))
stop on runlevel [!2345]
respawn
exec /sbin/getty -8 115200 ttyO0
\\
処理の流れとしては、下記のようになっています。
* console-detect.conf
* "/run" が mount されたイベントを契機に起動 (start on mounted MOUNTPOINT=/run)
* 変数 "consoledev", "CONSOLEDEV" を定義 (env ...)
* イベント "consoledev" を定義 (emits ...)
* pre-start のスクリプト実行 (/bin/dash による)
* /proc/cmdline の内容をパースし、"console=ttyXXXX" から console を検出
* initctl emit により、"consoledev" イベントを発行 (パラメータ "CONSOLEDEV=ttyXXXX")
* ttyO0.conf (ttyO1.conf)
* 下記条件に当てはまる場合、処理が行われる (start on)
* ランレベル [2345] の起動処理(rc)が終了
* パラメータ "CONSOLEDEV=ttyO0" の consoledev イベントが発行されている
* コンテナ内ではない(not-container)、もしくは "CONTAINER=lxc"、もしくは "CONTAINER=lxc-libvirt" である((container-detect.conf で発行されるイベントです (not-container/container) ))
* ランレベル [!2345] (停止) の場合、停止する (stop on)
* 処理が停止してしまった場合、再起動させる (respawn)
* getty コマンドを実行する (exec /sbin/getty ...)
\\
==== Job を定義する ====
簡単な例として、起動したら定期的にログを出力するだけのスクリプトを自動起動させる Job を定義してみます。\\
下記のような簡単なスクリプトを用意してみました。
#! /bin/bash
logger -t sample "Booted."
while true; do
logger -t sample "alive."
sleep 10
done
\\
これを自動起動するための Job ファイルを作成します。/etc/init/sample-job.conf とします。
# sample job
#
description "sample user job"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /bin/bash /root/sample.sh
\\
ためしに、service コマンドで起動してみます。
root@plum:~# service sample-job start
sample-job start/running, process 1417
root@plum:~#
\\
起動したようです。ps コマンドで確認してみます。
root@plum:~# ps ax |tail
1213 pts/1 Ss 0:00 -bash
1250 pts/1 S 0:00 sudo su -
1257 pts/1 S 0:00 su -
1266 pts/1 S 0:01 -su
1338 ? S 0:00 [kworker/0:2]
1353 ? S 0:00 [kworker/0:0]
1417 ? Ss 0:00 /bin/bash /root/sample.sh <---
1426 ? S 0:00 sleep 10
1427 pts/1 R+ 0:00 ps ax
1428 pts/1 R+ 0:00 -su
root@plum:~#
\\
起動していることが確認できました。\\
"respawn" オプションをつけておいたので、不意に死んだときに再起動されるか確認してみます。
root@plum:~# kill 1417
root@plum:~# ps ax |tail
1210 ? S 0:00 sshd: user1@pts/1
1213 pts/1 Ss 0:00 -bash
1250 pts/1 S 0:00 sudo su -
1257 pts/1 S 0:00 su -
1266 pts/1 S 0:01 -su
1353 ? S 0:00 [kworker/0:0]
1445 ? Ss 0:00 /bin/bash /root/sample.sh
1448 ? S 0:00 sleep 10
1449 pts/1 R+ 0:00 ps ax
1450 pts/1 S+ 0:00 tail
root@plum:~#
\\
さきほどとは違うProcess ID (1417 => 1445) になって、起動していることがわかります。\\
明示的に停止させる場合は、service コマンドで制御します。
root@plum:~# service sample-job stop
sample-job stop/waiting
root@plum:~# ps ax |tail
1191 ? Ss 0:00 sshd: user1 [priv]
1210 ? S 0:00 sshd: user1@pts/1
1213 pts/1 Ss 0:00 -bash
1250 pts/1 S 0:00 sudo su -
1257 pts/1 S 0:00 su -
1266 pts/1 S 0:01 -su
1353 ? S 0:00 [kworker/0:0]
1455 ? S 0:00 [kworker/0:2]
1476 pts/1 R+ 0:00 ps ax
1477 pts/1 S+ 0:00 tail
root@plum:~#
\\
==== 詳細情報 ====
より細かい制御を行いたい場合、[[http://upstart.ubuntu.com/cookbook/|公式ページの Cookbook]] を参照してください。
\\