今までPCで定期実行する際はpycron使ってたんですが、 pycronがタスクを実行するときにWindowsが起動中だとWindowsの動作がおかしくなり、 深刻なエラーから回復しましたとか出てたので、PCのログイン時に起動するようにしたcygwinのcronを使うようにしました。
で、まあGoogleで検索してみるとサービスとして実行する方法はよく載ってるんですが、 サービスとしてインストールせずに使用する方法が載ってないので、 自分のやったことをまとめてみる次第。
1. cygwinのcronをインストールする
まずはともかくcygwinのcronをインストール。
まあこれはsetup.exeでcronのパッケージ探してインストールだけなので、詳しい説明はカット。
2. cygwin上からcron-configを実行する
で次にcronの起動準備を整えるために、
$ cron-config
を実行。そうすると、cronを実行する際にエラーとなることを言ってくるので、 それを修正。
で、修正が終わってからもう一度cron-configを実行すると
$ cron-config
Do you want to install the cron daemon as a service? (yes/no) no (ここはnoを入力)
Running cron_diagnose ...
... no problem found.
Do you want to start the cron daemon as a job now? (yes/no) no (これも同じくnoを入力)
OK. Type '/usr/sbin/cron' to start the cron daemon job.
In case of problem, examine the log file for cron,
/var/log/cron.log, and the Windows event log (using /usr/bin/cronevents)
for information about the problem cron is having.
Examine also any cron.log file in the HOME directory
(or the file specified in MAILTO) and cron related files in /tmp.
If you cannot fix the problem, then report it to cygwin@cygwin.com.
Please run the script /usr/bin/cronbug and ATTACH its output
(the file cronbug.txt) to your e-mail.
という感じで、... no problem found.と出たらOK。
これでcronを実行できる準備ができました。
3. crontabでジョブを登録する
まあcygwin上での作業はこれで最後なんですが、crontabコマンドでジョブを登録します。
$ crontab -e
でエディタが立ち上がってくるので
* * * * * /bin/date >>/tmp/date.log 2>&1
みたいな感じでジョブを登録。ちなみに上記はcronがちゃんと動くかどうかテストするときに使ったコマンドです。
あと注意点としてはLinuxのcrontabの書式とcygwinのcrontabの書式は微妙に違うので(cygwinの方はユーザーの指定がない)、 その点注意しないとはまることになります。俺も最初ちょろっとはまりました。
で、まあ最初はテスト用のコマンドを入力しておいて、コマンドがきちんと指定したとおりに実行できることを確認してから、 本番用のコマンドを入力するのが良いと思います。
4. cronを立ち上げるbatファイルを書く
で、最後にこれ。今回自分が結構はまったポイント。
最初にcygwinを起動するbatファイルを加工して、cronを直接実行するようにしたんだけど、
なんか無限ループっつーかおかしな挙動をしたので、
今回はシェルスクリプト経由でcronを立ち上げるという方法を取りました。
で、まずcronを立ち上げるシェルスクリプトを用意。
#!/bin/sh
cron &
で、次にcygwinを実行するbatファイルを加工して、シェルスクリプトを実行するbatファイルを作成。自分の場合こんな感じ。
set CYGDRIVE=Z:
set HOME=%CYGDRIVE%\cygwin\home\nyarla
set PATH=%CYGDRIVE%\cygwin\bin;Z:\cygwin\usr\X11R6\bin;%CYGDRIVE%\cygwin\usr\sbin
sh /cygdrive/z/backup/bin/cron.sh
で、ここで一回はまったんだけど、sh の引数でシェルスクリプトを指定するときに、相対パスで指定すると、
batファイルの実行する加減によってはシェルスクリプトを見つけられないということになるっぽいので、
絶対パスで指定するようにした方がいいです。
で、このままbatファイルをスタートアップに登録すれば無事cronをログイン時に起動させる事ができるようになるんだけど、 そのままでは一瞬だけコマンドプロンプトが表示されてしまうので、 hideconsoleというアプリケーションを使って、 コマンドプロンプトを隠します。
まず上記のリンクからアーカイブを落としてきて、適当なディレクトリにファイルを解凍、
んで、解凍したらhideconsole.exeのショートカットを作成して、
リンク先を
{hideconsoleのディレクトリ}\hideconsole.exe {cronを実行するbatファイルへのフルパス}
という感じで指定します。
で、あとは出来上がったショートカットをダブルクリックして実行すれば、 裏でcronが立ち上がるようになります。
で、さっきも書いたけど最初このときにshの引数で指定するシェルスクリプトのパスが相対パスだったもんで、
batファイルを直接実行するとcronが立ち上がるのにhideconsole経由で実行するとcronが立ち上がらないという状況になりました。
まあ絶対パスで指定したら直ったんだけど。
で、あとは出来上がったショートカットをスタートアップフォルダに放り込めば、 Windowsのログイン時にcronが立ち上がるようになります。
5. 以上終了
で、自分のところでは大体1時間ぐらいで上記の作業をやりました。
実は前にも一回途中までやってたんだけど、cronを実行するところでつまずいて、 数時間無駄にしたことがあったんだけど、今回やり直してみたら、なんとかできた次第。
あと自分の場合、rsyncでバックアップするbatファイルもcronで実行できるように シェルスクリプトとして書き直したりしてました。 まあシェルスクリプトとして書き直したら結構スマートになったり。
まあ正直cygwinのcronをサービスとして使用せずに使うなんて事に需要あるのかわかりませんが、 今回作業したことをまとめてみました。
良かったら試してみてください。