「NASの起動時に calibre-web を自動実行する」で、QNAP NAS HS-210 で autorun.sh を自動起動できるようにしたが、NASのコントロールパネルの「ハードウェア」にある「起動時にユーザ定義処理を実行」を使っていない形になっていた。
「起動時にユーザ定義処理を実行」でcalibre-webの自動実行を行うように設定を見直してみた。
調べてみると、単純に autorun.sh で calibre-web を実行するように記述すると、実行に利用している python を使えるようにする entware の実行よりも先に autorun.sh が実行され、pythonがないために実行を失敗するということがわかった。
具体的には /opt/bin/python から python2.7 にシンボリックリンクが張られているが、python2.7 がentwareの実行後でないとアクセスできない。
しかたがないので、python が利用できるようになるのを待ち、pythonが利用できるようになってから calibre-web を実行するようにした。
備忘録として経緯を残しておく。
autorun.sh の作成場所
QNAP のサイトにある Running Your Own Application at Startup の記述に従って autorun.sh を設定した。
フラッシュメモリを使ったデバイスの MTD (Memory Technology Device) に、autorun.sh を置く必要がある。HS-210 では、/dev/mtdblock5 が対象デバイスのようだ。
次のようにマウントした。
1 |
mount -t ext2 /dev/mtdblock5 /tmp/config |
このファイルシステムには次のスクリーンショットで示すように、ディレクトリ lost+found、ファイル smb.conf.cksum、uLinux.conf、customise.conf、smb.conf、system.map.key がある。
ここ( 上記のマウント後の /tmp/config )に autorun.sh を作成する。
スクリーンショットは、autorun.sh を作成した後のものである。
次のようにマウントを解除してから再起動したが、calibre-webがうまく実行されない。
1 |
umount /tmp/config |
autorun.sh とサービスの起動順序
調べてみると、python を含んでいる entware を開始しておかないと /opt/bin/python のシンボリックリンク先がなく、pythonが起動できないために失敗することがわかった。
10分程度の固定時間のsleep を入れてから calibre-web を実行するようにしてみたが、autorun.sh の実行を終えてからでないとNAS のサービスアプリケーションや entware が実行されないことがわかった。
NASにログインすると「PhotoStationを起動しています」などのメッセージが表示されていて、進行中と思っていた。しかし、autorun.sh の内部で待たせるといつまでたっても他のサービスの起動にならず、同じ状態が続く。autorun.sh の実行を終わるようにしたら、それなりの時間で処理が進むようになった。
また、entware は他のサービスよりも後に実行されているようであり、entwareが実行されるまでの時間を予測して固定した値にしておくことは困難であるようだ。
そこで、autorun.sh から calibre-web を起動するスクリプトである calibre-web.sh をバックグラウンドで実行する。calibre-web.sh では /opt/bin/python がアクセスできるようになるのを待ち、アクセスできるようになったら、calibre-web を実行するようにした。
最終的な autorun.sh と calibre-web.sh は以下のようにした。autorun.log と calibre-web.log にログを記録するようになっている。autorun.sh の実行時のカレントディレクトリは / であり、autorun.log と calibre-web.log はルートに作成される。ルートからのファイルシステムは起動するたびに作成されるようで、ログは再起動するとクリアされる。
autorun.sh
autorun.sh 実行時のカレントディレクトリがルートディレクトリなので、SCRIPT_DIR にautorun.sh のディレクトリを取り出して、calibre-web.sh を実行している。
薄い(黄色い)網のかかった2、4、6行目は、デバッグ用のログ出力なので省略して良い。
1 2 3 4 5 6 |
#!/bin/sh date >> autorun.log SCRIPT_DIR=$(dirname $0) echo $SCRIPT_DIR >> autorun.log ${SCRIPT_DIR}/calibre-web.sh & date >> autorun.log |
calibre-web.sh
autorun.sh と同じディレクトリに置く必要がある。
/opt/bin/python を ls して実行終了ステータスが0以外でなければ60秒間 sleep して再試行する。
/opt/bin/python にアクセスできるようになったら、calibre-web を実行する。
デバッグ用のメッセージなどを calibre-web.log に記録するようになっているので、見づらいプログラムになっている。
薄い(黄色い)網のかかった行は、デバッグ用のログ出力なので省略して良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh date >> calibre-web.log ls -l /opt/bin/python >> calibre-web.log 2>&1 status=$? while [ $status -ne 0 ] do echo $status >> calibre-web.log sleep 60 date >> calibre-web.log ls -l /opt/bin/python >> calibre-web.log 2>&1 status=$? done ls -l /share/MD0_DATA/Public/calibre-web/cps.py >> calibre-web.log 2>&1 date >> calibre-web.log /opt/bin/python /share/MD0_DATA/Public/calibre-web/cps.py >> calibre-web.log 2>&1 echo $? >> calibre-web.log date >> calibre-web.log |
起動時にユーザ定義処理を実行
NASのコントロールパネルの「ハードウェア」にある「起動時にユーザ定義処理を実行」のチェックを入れることで、起動時に autorun.sh が実行されるようにできた。
また、autorun.sh の内容を見ることができた。
HS-210 は非力なので、電源を入れてから calibre-web が利用できるようなるまでに10分程度はかかる。もちろん、起動するサービスによって時間は変わる。
しかし、 calibre-web ですらHS-210では遅く、我慢を試されている感じである。