============================================================================== Zaurus/Linux にある atd で指定時間にコマンド実行させてみる たなかとしひさ(tosihisa@netfort.gr.jp) 最終更新:$Id: zaurus_atd.txt,v 1.3 2003/01/14 08:19:07 tosihisa Exp $ ============================================================================== Zaurus SL-B500 には、標準で atd はインストールされていますが、at に相当する コマンドが入っていない様です。ですので、ターミナル等から手軽に指定した時間 にコマンドを実行させにくい状態です。 そこで、atd の動作を分かる範囲で調べて、crond とまでには行きませんが、指定し た時間に Zaurus の電源を ON にして、コマンドを実行する方法がある程度わかりま したので、まとめておきます。 この文書は*無保証*です。あくまで、私自身が試した事について書いています。 また、この文書は*不完全*である事もご理解ください。 この文書に書かれている事を実行する事により、お使いの Zaurus 環境に何か支障が 発生しても、責務を負う事は出来ません。 Table of Contents 1.Zaurus SL-B500 標準の atd で指定実行させてみる。 2.atd の考察 ============================================================================== 1.Zaurus SL-B500 標準の atd で指定時間実行させてみる。 Zaurus にインストールされている atd は、指定時間によるコマンド実行以外に、 RTC を監視し、指定した時間になれば、Zaurus の電源を ON にする (その後、コマンド実行)機能も持っている様です。 Zaurus にインストールされている atd は、/var/spool/at ディレクトリを監視し、 そのディレクトリの中に、 "[指定した時間(1970年からの経過秒数)].[ユニークID??]" の規則に合う実行可能ファイル(シェルスクリプト)が存在すれば、それを実行する様 です。この時、Zaurusの電源が入っていないなら、Zaurus の電源が ON されます。 ここでは、2003年1月14日、16時30分00秒に、テストとして date コマンドを実行す る方法について記載します。 (1) まず、Zaurus 上で、指定した時間(2003年1月14日、16時30分00秒)に実行させた い「シェルスクリプト」を作成しておきます。 私は、/tmp/at.sh と言う名前のシェルスクリプトを作成し、以下の様に作成し ました。 ----[/tmp/at.sh]---- #!/bin/sh date >> /home/root/date.log -------------------- 上のスクリプトは、指定した時間に date コマンドが実行出来ているかを確認 するために、date コマンドの出力結果を、/home/root/date.log に残します。 (2) (1) で作成したシェルスクリプトを、以下の名前で保存します。 /var/spool/at/"[指定した時間(1970年からの経過秒数)].[ユニークID??]" 私は、この /var/spool/at への保存処理を自動化するために、以下のシェル スクリプトを作成しました。 これは、いわゆる at コマンドの代わりに使えるものです。 ----[at_add.sh]---- #!/bin/sh attime=`date -d "$1" +%s` atfile="/var/spool/at/"$attime".123" cp $2 $atfile echo "rm" $atfile >> $atfile chmod +x $atfile echo $atfile is add. -------------------- 上のシェルスクリプト(at_add.sh)は、引数を2個取り、一つ目に実行させた い時間、二つ目に、実行させたいシェルスクリプトを指定します。 その時、/var/spool/at/ 以下に保存された自ファイルを、処理終了後に削除 する様にさせます(理由は、「2.atd の考察」を参照の事)。 at_add.sh の一つ目の引数(実行させたい時間)は、以下の書式で与えます。 2003.01.14-7:30:00 年月日の切り分けには、'.' 文字を使います。また、「年月日」と「時分」 の切り分けには、'-' を使います。これは、Zaurus の date コマンドが 処理できる書式です。 実行させたい時間は、UTC で設定します。従って、日本時間(JST)の 16時に コマンドを実行させたければ、16-9 で、7時と設定する必要があります。 これらをふまえて、/var/spool/at 以下に、実行させたいシェルスクリプト を登録させてみます。 bash-2.05# ./at_add.sh 2003.01.14-7:30:00 /tmp/at.sh /var/spool/at/1042529400.123 is add. bash-2.05# /var/spool/at 以下に、登録できた様です。 念の為に、/var/spol/at 以下を覗いてみます。 bash-2.05# ls -al /var/spool/at/ drwxr-xr-x 2 root root 0 Jan 14 07:19 . drwxr-xr-x 3 root root 0 Dec 31 15:04 .. -rwxr-xr-x 1 root root 70 Jan 14 07:19 1042529400.123 prwxr-xr-x 1 root root 0 Jan 14 03:55 trigger bash-2.05# cat /var/spool/at/1042529400.123 #!/bin/sh date >> /home/root/date.log rm /var/spool/at/1042529400.123 bash-2.05# /var/spool/at 以下に保存するスクリプトファイルの拡張子(上記では".123") ですが、これは、恐らくファイルのユニークさを保つためにある様???です。 ですので、何らかの方法で、重複しない様な数値を使うと良いと思います。 (この部分、推測です。もし間違っていたらフォロー頂けると嬉しいです) (3) Zaurus の電源を切って、指定した時間になるのを待ちます。 うまく設定できているなら、Zaurus の電源が自動的に ON され、スクリプト が実行されているはずです。 指定した時間に Zaurus の電源が ON されたなら、date コマンドが実行されて いるか確認します。 bash-2.05# ls -al /home/root/date.log -rw-r--r-- 1 root root 29 Jan 14 07:30 /home/root/date.log bash-2.05# cat /home/root/date.log Tue Jan 14 07:30:20 UTC 2003 20秒の誤差が出ていますが、指定された時間に、date コマンドが実行されて いました。 ============================================================================== 2.atd の考察 Zaurus に搭載されている「カレンダー」アプリケーションは、予定時刻にアラーム を鳴らす機能を持っており、Zaurus 自身の電源が切れていても、その予定時刻になれ ば、Zaurus の電源を ON しますが、その予定時刻の起動には、atd の助けを借りてい る模様です。 atd は、もし /var/spool/at 以下に、古い時間(過ぎ去った時間)に作られたシェル スクリプトファイルが存在すれば、間をおかずにそれを実行する模様です。ですので、 atd で実行されたシェルスクリプトは、最後に自ファイルを削除する様にしておかな いと、1分毎?にそのスクリプトが再度実行されてしまう模様です。