Cygwinでcronを使うときのメモ

googleで検索したらすぐに出ました。

手順

まず、Cygwinインストーラー(setup.exe)からcygrunsrvとcronをインストールしておく。あと、crontab編集のためにvi(m)とかもインストールしておくとよいかも。

インストール後、サービスに登録する。

$ cygrunsrv -I cron -p /usr/sbin/cron -a -n

cygrunsrv -S でスタート。

$ cygrunsrv -S cron

cygrunsrv -Q で状態を確認。

$ cygrunsrv -Q cron
Service             : cron
Current State       : Running
Controls Accepted   : Stop
Command             : /usr/sbin/cron -n

ところで。Webで調べるとcronの引数に-Dを指定してるサイトばっかりだったんだけど*1、-Dってなんだ?マニュアルにも載ってないし・・・。試してみると、-Dをつけるとforegroundで動いてるみたいだけど。
ソースを見てみると、NoForkオプションみたいですね。backward compatibilityのために残しているけど、今は-nオプションを使ったほうがいいみたい。

static void
parse_args(int argc, char *argv[]) {
        int argch;

        while (-1 != (argch = getopt(argc, argv, "Dnx:"))) {
                switch (argch) {
                default:
                        usage();
                case 'x':
                        if (!set_debug_flags(optarg))
                                usage();
                        break;
                case 'D': /* Cygwin backward compatibility */
                case 'n':
                        NoFork = 1;
                        break;
                }
        }
}

マニュアルにも書いてありました。

The -n option changes this default behavior causing it to run in the fore-
ground. This can be useful when starting it out of init.

あとは、マイコンピューターを右クリックして、「管理」→「サービスとアプリケーション」からcronを選んで、必要に応じて「デスクトップとの対話をサービスに許可」をチェックする。

んー

めんどくさそうとか、Windowsのタスクスケジューラーと競合するじゃんとか思って微妙に敬遠してたけど、案外楽ちんだなあ。vi入れると使いごこちはUNIXと変わらない。cygrunsrvの使い勝手が、某UNIXのサービス監視系コマンドに似てて*2楽しいぞ。これは積極的に使っていきたい。タスクスケジューラーより保守が簡単だしね。crontabをコピーしときゃいいわけだし。

追記

これをcrontabにコピペしておくと便利。いつも忘れるんだよね。

# *     *     *   *    *        command to be executed
# -     -     -   -    -
# |     |     |   |    |
# |     |     |   |    +----- day of week (0 - 6) (Sunday=0)
# |     |     |   +------- month (1 - 12)
# |     |     +--------- day of        month (1 - 31)
# |     +----------- hour (0 - 23)
# +------------- min (0 - 59)
# minute  hour  day_of_month  month  weekday  command

追記2

手動で設定すると動かないことがあるので、cron-config で設定したほうがよさげ。
あと、動かないときは /usr/bin/cronevents を実行するとログが出てきます。(Windowsのイベントログのようです)

追記3

croneventsで"WRONG FILE OWNER"が出るときは、/etc/passwd と /etc/group の設定が正しいか確認しましょう。

など。

*1:上の2つ含む

*2:まあLinuxも似たようなものがあるけど