hakeの日記

Windows環境でプログラミングの勉強をしています。

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