読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

crontabを編集してcronを登録してみる

cronとは

cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。

cron の設定ガイド

この後も上を参考に書きます。

 

どうやって設定するのか

crontab -e

でcronのコマンドを登録するファイルであるcrontabをvimで編集することが出来ます。 

linuxではなくmacの10.9.3なのですが、crontabはどこに置いてあったかというと、

/usr/bin/crontab

でした。

 

ためしに、

0-59/1 * * * * echo "hello"

と書いて保存します。

 

すると、

/var/mail/woshidan(username)

From woshidan@woshidan-no-MacBook-Air.local  Mon Dec  8 16:54:00 2014
Return-Path: <woshidan@woshidan-no-MacBook-Air.local>
X-Original-To: woshidan
Delivered-To: woshidan@woshidan-no-MacBook-Air.local
Received: by woshidan-no-MacBook-Air.local (Postfix, from userid 501)
  id 291421F36C49; Mon,  8 Dec 2014 16:54:00 +0900 (JST)
From: woshidan@woshidan-no-MacBook-Air.local (Cron Daemon)
To: woshidan@woshidan-no-MacBook-Air.local
Subject: Cron <woshidan@woshidan-no-MacBook-Air> echo "hello"
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=woshidan>
X-Cron-Env: <USER=woshidan>
X-Cron-Env: <HOME=/Users/woshidan>
Message-Id: <20141208075400.291421F36C49@woshidan-no-MacBook-Air.local>
Date: Mon,  8 Dec 2014 16:54:00 +0900 (JST)

hello

 

というようなログが1分ごとに出力されていて、
とりあえず定時で自動的に出力されているのが確認できます。
このechoのところをrails runnerとかに変えてバッチ処理を回したい感じです。
さて、大変なことになるので即刻戻します。

 

コマンドの書き方について

さっきの

0-59/1 * * * * echo "hello"

ですが、

分 時 日 月 曜日 コマンド

の順になっています。

 

各数の部分について、
* はいつでもという意味です。

m-l
は曜日の部分で行えばm曜日からl曜日の間に、という指定になります。

m-l/n
は分の部分で行えばm分からl分の間でn分ごとに、という指定になります。

a,b,c,d
は分の部分で行えばa分,b分,c分,d分が来るごとに、という指定になります。

 

もっと細かいことは、cron の設定ガイドで確認してください。

 

wheneverを使うと

railsでcronならwheneverでしょ、という話になっていますが、

wheneverはcrontabに書くべきコマンドを綺麗に吐き出してくれるgemです。

 

細かいことは

https://github.com/javan/whenever

Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails4.1] - 酒と泪とRubyとRailsと

を見てください。

 

wheneverize .

で作成したconfig/schedule.rbに書いたrubyでタスクを

whenever

でcrontabに書き込む形で標準出力してくれます。

deploy先に登録するのは、capstranoのデプロイするツールのお仕事みたいです。

これは終わって理解したら書きます。

 

[2015/1/1追記]

capistrano3のデプロイ時の設定ファイルconfig/deploy.rbに

# Whenever setup
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

を足し、

wheneverizeの設定ファイルのconfig/schedule.rbに

set :environment, :production

という形で、動作環境を書いておいたら、capistrano3でデプロイしただけでcronが登録されてました。

あまりにあっさりすぎて引きました(え)

わざわざ3とついているのはcapistranoは2系と3系で結構文法がちがうからです。ご注意ください。