hakeの日記

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

指定時間にコマンドを実行させる

automailやQTアラムーチョのように指定時刻にコマンドを実行させる手段を調べてみた。
指定時刻に実行する機能はatdが行っているらしい、/var/spool/at/以下にファイル名「指定時刻(1970年からの秒数)」.「任意の拡張子?」のスクリプトファイルを登録するとatdがこれを監視していて実行させているらしい。
実際にどの様に登録を行うかというと以下の2通りの方法がある。


atコマンドによる登録
SL-C3000には登録用にatというコマンドが用意されている。使用方法は

$ su
# echo command | at 2005.03.10-21:34:00

のように実行させたいコマンドを時刻指定したatコマンドへパイプで接続させる。



シェルスクリプトによる登録
atコマンドによる登録では指定時間に1回の実行しかできない。一定間隔で実行させるためにはatコマンドと同等の役割を行うスクリプトを作成する必要がある。一例として/home/QtPalmtop/bin/at_regi.shを作成してみた。

#!/bin/sh

ATD=/home/QtPalmtop/bin/atd
ATSPOOL=/var/spool/at

case "$1" in
     -d)
	EXETIME=`date -d "$2" +%s`
	;;
     -s)
	EXETIME="$2"
	;;
      *)
	;;
esac

ATFILE=/var/spool/at/${EXETIME}.444
NEXTTIME=`expr $EXETIME + $3`

echo \#!/bin/sh > $ATFILE
echo rm \$0 >> $ATFILE
echo su zaurus -c \""$4"\" >> $ATFILE
echo export TZ=Asia/Tokyo >> $ATFILE
echo /home/QtPalmtop/bin/at_regi.sh -s "$NEXTTIME" "$3" \""$4"\" >> $ATFILE

chown root:qpe $ATFILE
chmod a+x $ATFILE
$ATD $ATSPOOL

使用方法は以下

$ su
# at_regi.sh -d yyyy.mm.dd-HH:MM:SS interval command
  • 引数で与えられた実行時間yyyy.mm.dd-HH:MM:SSは、dateコマンドで1970年からの秒数に変更させて登録ファイル名$EXETIMEとする
  • 登録ファイル名は、${EXETIME}.444
  • 次回実行時間$NEXTTIMEを$EXETIME+intervel($3)で計算
  • /var/spool/at/${EXETIME}.444のファイルを作成する
  • パーミッションとオーナーの変更
  • /home/QtPalmtop/bin/atd /var/spool/atでファイルの登録を行う、これを実施しないと指定時刻になっても登録ファイルが実行されない

登録内容は以下のとおり(automailが作成する内容に準じた)

#!/bin/sh
rm $0
su zaurus -c "command"
export TZ=Asia/Tokyo
/home/QtPalmtop/bin/at_regi.sh -s $NEXTTIME interval "command"
  • 登録ファイルの削除
  • commandの実行
  • at_regi.shを呼び出して次回実行の登録を行う。

このようにするとautomailとほぼ同じ機能を持たせることができる。また、3月7日の日記で紹介したautomailでは登録ファイルの拡張子が.333固定のため複数のコマンド登録させる場合、実行時間が重ならないように注意をする必要があったが、このスクリプトでは拡張子を引数に追加すれば登録するコマンド各々で別の拡張子を持たせることも可能である為、そのような注意をしなくても良くなる。
あるいは実行回数を引数にして

$NEXTCNT=`expr $COUNT - 1`
if [ $NEXTCNT -eq 0]; then 〜

のようにすれば指定回数の実行も可能だと思う。