cron_inet.rb - 自動実行時刻の詳細設定
指定時刻に特定の操作をさせたい手段として、QTアラムーチョやautomailなどのアプリケーションがありますが、基本的に設定できる内容は指定時刻に実行あるいは定期間隔で実行というものでした、特定の時間帯あるいは曜日に実行したいなど、もっと複雑な時刻設定が可能なものがないか探したところcron_inetというRubyスクリプトを発見したので実験してみました。
NABE Hiki - SL-C700.cron_inet.rb
http://sun.dhis.portside.net/~sakira/wiki/hiki.cgi?SL-C700.cron_inet.rb
インストールパッケージは下記からcroninet_1.6d.0.81-1_arm.ipkをダウンロードします。
NABE Hiki - SL-C700.CronInet
http://sun.dhis.portside.net/~sakira/wiki/hiki.cgi?SL-C700.CronInet
Rubyスクリプトなので別途Rubyをインストールする必要があります。
インストールするとCronInetというアイコンが作られますが、今回はこれは使用しません。したがってインストールパッケージからcron_inet.rbとcrontab.rbだけ取り出して持ってきても良いかもしれません。ちなみにアイコンをクリックしてみたのですが、何故か起動しませんでした(Ruby/Qteはインストール、Rubyのパーミッション修正済み)
実行させるスクリプトの登録は/home/root/.cron_inetrcに記述します。
$cron_online = <<CronOnline * * * * * user {path}/command ---(*) CronOnline $cron_offline = <<CronOffline * * * * * user {path}/command ---(*) CronOffline $cron_suspend = <<CronSuspend * * * * * user {path}/command ---(*) CronSuspend
“$cron_online”“$cron_offline”“$cron_suspend”はそれぞれネット接続時、電源ON(ネット未接続)、電源OFF(サスペンド)時という条件で(*)部分に実際に実行させたい時刻、コマンドを記述することになります。
/QtPalmtop/bin/automailというスクリプトを実行させたい場合は
*/20 * * * * zaurus /QtPalmtop/bin/automail 毎時20分毎に実行 5 4 * * sun zaurus /QtPalmtop/bin/automail 日曜の4時5分に実行 5,35 9-18 18 5 * zaurus /QtPalmtop/bin/automail 5月18日の9-18時に毎時5分と35分に実行
となります、詳しい設定方法は末尾のManpage of CRONTABを参照です。
inet_cron.rbの実行と停止は
$ su # cron_inet.rb 2>/dev/null & ------- 実行 # killall cron_inet.rb ------- 停止
となります。
cron_inet.rbはネット接続して何かをさせることを前提にしているので、$cron_offlineや$cron_suspendに登録した内容は実行の前後で自動にネット接続と切断が行われます。自分の場合、データのバックアップ等ネットに関係ないことも行わせたいので自動ネット接続/切断を行わないようにしてみました。変更箇所はcron_inet.rbの620行目付近のINetConnectクラスの定義部分で
class INetConnect (中略) def card_exist? if (/function: [26] / =~ `#{$card_ident}`) then true else false end end def alive? if (/^0\.0\.0\.0\s+([^\s]+)\s/ =~ `/sbin/route -n| /bin/grep "^0.0.0.0"`) then if (@host_to_check == nil) then ip = $1 else ip = @host_to_check end ping_str = `ping -c 3 #{ip}` if (/time=/ =~ ping_str) then return true end end false end
を
class INetConnect (中略) def card_exist? true end def alive? true end
に書き換えました。ちょっと試したところ上手く動いているみたいなので良いと思います(多分) なおこの修正でスクリプトがネット接続しているか確認にいくと常に接続していると認識するため、電源ON時の登録は“$cron_online”に記述することになります。また、当然ですがネット接続/切断させたい場合は登録させる各スクリプト側でその操作を記述する必要が生じます。
(追加)
975行目の以下をコメントアウトしないと、ネット接続しないスクリプトを電源OFF時に実行させると、すぐにサスペンドしてしまう。
@qcop.call($suspend)
テストとして電源OFFしている場合に20分毎にメールの送受信を行わせてみました。
実行スクリプト/home/QtPalmtop/bin/mail_sr.sh、これはautomailで使用しているメール送受スクリプトでも良いでしょう。
#!/bin/sh export LD_LIBRARY_PATH=/home/QtPalmtop/lib export QPEDIR=/home/QtPalmtop export QPEGROUP=qpe export QPEUSER=zaurus export QTDIR=/home/QtPalmtop # connect Network ----- オリジナルのcron_inet.rb使用時この部分不要 while [ -z `/sbin/ifconfig | grep -e "^[^lo].*Link"`] do ${QPEDIR}/bin/qcop QPE/Network 'connectRequest()' sleep 1 ${QPEDIR}/bin/qcop QPE/InputHelper 'key(QString)' "click Escape" sleep 20 done # execute QTmail & Send/Receive & Quit ${QPEDIR}/bin/qcop QPE/System 'execute(QString,QString)' qtmail sleep 15 ${QPEDIR}/bin/qcop QPE/Application/qtmail 'sendrecv(QString)' sleep 5 ${QPEDIR}/bin/qcop QPE/Application/qtmail 'quit()' sleep 5 # disconnect Network ----- オリジナルのcron_inet.rb使用時これ以下不要 ${QPEDIR}/bin/qcop QPE/Network 'stop()' sleep 5 # suspend ----- ザウルスのオートパワーオフ機能で代用可 ${QPEDIR}/bin/qcop QPE/Application/suspend 'raise()'
/home/root/.cron_inetrcに記述する内容は
$cron_suspend = <<CronSuspend */20 * * * * zaurus /home/QtPalmtop/bin/mail_sr.sh CronSuspend
となります。
参考サイト:
Manpage of CRONTAB
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html#lbAD
ruby入手先 (ruby_1.8.0-1_arm.ipk)
http://sourceforge.jp/projects/zaurus-ja/files/?release_id=5690#5690