$Id: README.jp,v 1.9 2007/10/30 03:44:31 nand Exp $

* cronwake は crontab のジョブに合わせて Mac OS X 10.3 マシンの
   wakeup/poweron を行なうデーモンです

(http://homepage.mac.com/nand/macosx/cronwake.html も参照下さい)


/etc/crontab と /var/cron/tabs/ 以下の crontab ファイルを読み込み、
指定したジョブの実行前にマシンが sleep からの回復、または shut down からの
起動を行なうように制御します。root 権限で起動する必要があります。

コンパイルするには:
 touch .depend
 make depend
 make

典型的な使い方:

 1. cronwake をどこかにコピーします。例えば /usr/local/bin/cronwake

 2. /etc/crontab に次のようなエントリを追加します。

	@reboot root /usr/local/bin/cronwake

    ただし、Mac OS X 10.5 では、各ユーザの crontab の場所が以前と変わっているので、
    上のエントリに代えて次のように cronwake を起動してください

	@reboot root /usr/local/bin/cronwake -u /usr/lib/cron/tabs

 3. 再起動 (restart) します。

 4. crontab を次のように変更します。

	CRONWAKE=wake
	0 6 * * *	job1
	CRONWAKE=wakepoweron
	0 12 * * *	job2
	0 18 * * *	job3
	CRONWAKE=none
	0 0 * * *	job4

    この例では、スリープしているマシンは 5:57,11:57,17:57 に wakeup します
     (job1,job2,job3 の実行3分前)
    shut down しているマシンは 11:55 と 17:55 に起動します (job2,job3 の5分前)
    また、スリープしているマシンは 11:57 と 17:57 に起動します。
    job4 の時刻はマシンの状態に影響を与えません。

    もしこのプログラムをテストされる場合は、6 分以上後の wake ジョブを登録して
    スリープさせるか、8 分以上後の wakepoweron ジョブを登録して shut down して
    下さい。近い未来のジョブについては設定が行なわれません。

*note*
  cronwake は cron の置換えではありません。 ジョブの実行は行ないません。


コマンドラインオプション:
cronwake [ -s system ] [ -S ] [ -u dir ] [ -U ] [ -p TTS ] [ -w n ] [ user ... ]
        -s system : システム crontab ファイルのパス名 (デフォルト: /etc/crontab)
        -S : システム crontab ファイルを読み込まない
        -u dir : ユーザの crontab ディレクトリ (デフォルト: /var/cron/tabs)
        -U : ユーザ crontab ファイルを読み込まない
        -p TTS : スリープするために必要な時間 + 90 (秒) 120 以上でないといけない
			(デフォルト: 120秒)
        -D : foreground で実行し、標準エラー出力に verbose messages を出力する
			(syslog を使わない)
	-w n : 機種とOSの組合せに依存する不具合を回避する (*note1*)
        user ... : ユーザ名のリスト (デフォルト: /var/cron/tabs にあるすべての
			ファイルを読み込む)

crontab の環境変数設定:
    CRONWAKE=wake
	マシンをジョブの実行前にスリープから復帰させます。
	(shut down しているマシンはそのままです)

    CRONWAKE=wakepoweron
	マシンをジョブの実行前に shut down 状態から起動します。
	またはスリープから復帰させます。

    CRONWAKE=poweron
	マシンをジョブの実行前に shut down 状態から起動します。
	(スリープしているマシンはそのままです)

    CRONWAKE=none
	ジョブに関して何も行ないません

    CRONWAKE_WAKEBEFORE=<num>
	スリープからの復帰をジョブの <num> 分前に設定します。
	<num> は 1 以上でなければなりません
	(デフォルト: 3 分)

    CRONWAKE_POWERONBEFORE=<num>
	shut down からの起動をジョブの <num> 分前に設定します。
	<num> は 1 以上でなければなりません
	(デフォルト: 5 分)

    CRONWAKE_NOSLEEPFOR=<num>
	CRONWAKE=wake または CRONWAKE=wakepoweron のジョブについて、
	ジョブの実行時刻から <num> 分間、idle sleep を防止します。
	<num> は 1 以上でなければなりません
	(デフォルト: 1 分)

*note*
  cronwake はユーザの指示したスリープ、shut down を防止できません。

  もし時刻 T にユーザがマシンをスリープさせた場合、
  Tjob - 60*CRONWAKE_WAKEBEFORE - TTS <= T <= Tjob
  であれば、おそらく時刻 Tjob 以降のジョブを実行できないでしょう。
  (TTS はコマンドラインオプション -p で指定した値 (デフォルト120秒) です)

  もし時刻 T にユーザがマシンを shut down した場合、
  Tjob - 60*CRONWAKE_POWERONBEFORE - TTS <= T <= Tjob
  であれば、おそらく時刻 Tjob 以降のジョブを実行できないでしょう。

*note*
  cronwake は /var/cron/tabs にあるファイルのうち、
  ファイル名に '.' を含むものは読み込みません。
  cronwake は /var/cron/tabs にあるファイルのファイル名が有効なユーザ名で
  あるかどうかのテストを行ないません。

*WARNING*
  このプログラムは daylight saving time を採用してる時間帯での動作については、
  ほとんどテストされていません。

  cronwake は crontab(1) や cron(8) よりも厳しく crontab(5) を検査するので、
  次のような crontab は cronwake によって拒否されてしまいます。
	10-60/20 * * * * echo test # 10-59/20 is acceptable by cronwake
	10-5 * * * * echo test # meaningless...
  もし cronwak が crontab のエントリを読むのに失敗すると、その crontab 全体が
  無視されます。エラーメッセージが /var/log/system.log に出力されます。
  (一つの crontab のエラーは他の crontab には影響しません。)

*既知の問題:
  もし「システム環境設定」の「セキュリティ」で、スリープやスクリー
  ンセーバーからの復帰時にパスワードを要求するように設定しておられたら、
  スリープからの復帰時にパスワードを入力しないと30秒で再度スリープしてしまいます。
  cronwake はこの場合のスリープを防止できませんので、正しく動きません。

  (*note1*)
  手元の iMac G5 (Boot ROM Version: 5.2.2f2, Mac OS X 10.3.6) では、
  cronwake はスリープから復帰させることができません。
  回避策: コマンドライオプションに -w 1 を指定して下さい。
  ただし、これを指定した場合、cronwake は
  wake イベントに代えて wakepoweron イベントを登録するようになります。
  つまり、CRONWAKE=wake のジョブに対しても、
  (ユーザの期待しない) 電源 ON を行なうようになります。

作者: Nozomu Ando <nand@mac.com>
nand@mac.com