cronでシェルスクリプトとrubyプログラムを定期実行させる
2017/01/31
こんにちは、okutani(@okutani_t)です。Linuxにある「cron」という機能を使うと、特定のプログラムを定期的に実行することができます。
本記事では「シェルスクリプト」と「Rubyプログラム」を定期的に実行する方法を解説しています。
今回は動作環境に、Vagrantで立ち上げたCentOS7を利用しています。また、Rubyはrbenvを使って導入しています。詳しく知りたい方は下記記事をそれぞれ参考にしてください。
では、さっそくcronを使ってプログラムを定期実行する方法を見ていきましょう。
スポンサーリンク
もくじ
cronでシェルスクリプトを動かしてみる
実際にcronを使ってみましょう。
まずは、適当にviで「hello.sh」を次のように作成しました。場所はホームディレクトリにしておきます。
$ vi ~/hello.sh
#!/bash/sh
echo hello > ~/hello.txt
このプログラムを実行すれば、ホームディレクトリに「hello」と書かれたhello.txtが作成されますね。次のコマンドで実行権限をつけておきましょう。
$ chmod +x ~/hello.sh
このプログラムをcronに登録するには「crontab -e」コマンドを使います。
$ crontab -e
viが立ち上がるので、次のように記述しましょう。
10 12 1 6 * /bin/bash ~/hello.sh
これで、「6/1 12:10に、hello.shを実行」という処理をcronに登録することができました。もし、同じ内容で試してみたい方は、現在時刻の1分後とかに設定してみましょう。
記述方法は、左から次のとおりです。
[分] [時] [日] [月] [曜日] [シェルのパス] [実行ファイル]
曜日は日曜から0~7の番号、もしくは英単語の頭文字3つで指定します。
- 月曜日: 1、もしくはmon
- 火曜日: 2、もしくはtue
- 水曜日: 3、もしくはwed
- 木曜日: 4、もしくはthu
- 金曜日: 5、もしくはfri
- 土曜日: 6、もしくはsat
- 日曜日: 7、もしくは0、もしくはsun
実は曜日以降で登録する箇所は、シェルスクリプトが直で書けます。なので、次のようにしても同じように実行されます。
10 12 1 6 * cd /home/okutani; /bin/bash hello.sh
さらに言うと、UNIXコマンドを次のように直接実行してもOKです。
10 12 1 6 * echo hello > ~/hello.txt
cronをセットして、1分ボケーっと待ってみると、~/hello.txtが作成されていることが確認できます。
$ ls
hello.sh hello.txt
ただ、これだけだと年に1回しか実行されないので、15分おきに実行されるように改良してみましょう。
*/15 * * * * /bin/bash ~/hello.sh
これで、15分に1回、hello.shが実行されます。
ただ、今回の例だと、hello.txtは常に同じ内容が上書きされるだけです。変化したかどうか分からないので、現在時刻を吐き出すようなスクリプトを書いてみると良いかと思います。
*/15 * * * * echo `date +'\%Y\%m\%d \%H\%M\%S'` > ~/hello.txt
15分おきに現在時刻がhello.txtに書き出されるか確認してみてください。
また、cronで登録した処理は、次のコマンドで一覧表示することができます。
$ crontab -l
登録した処理の削除は次のコマンド。
$ crontab -r
これで一通りのcronの使い方が分かりました。
おまけ: -rと-eの関係について
ここで気になった方もいるかと思いますが、「-r」オプションをつけてcrontabコマンドを実行すると、すぐさま登録した処理がすべて削除されます。
rキーは、登録のオプション「-e」と隣り合わせなため、うっかり削除してしまう恐れがあります。
対処法はいくつかありますが、一番気軽にできる対処としては、crontabコマンド実行時に毎回、確認メッセージをいれることです。
「~/.bashrc」などに、次の記述を追加すればOKです。
alias crontab="crontab -i"
もしくは、登録処理をcron.txtなどに記述し、それを元に登録する方法もあります。
$ crontab cron.txt
うっかりミスをやってしまう前に、あらかじめこのような対処をしておくと良いですね。
参考crontab -e は「絶対に」使ってはいけない – ろば電子が詰まっている
参考危険な crontab -r を封印する – Qiita
cronでrubyプログラムを定期実行
cronの使い方が分かったので、今度はrubyで作成したプログラムを定期実行してみます。
お仕事で「毎月1日に定期実行するrubyプログラム」を用意しなくてはいけなかったので、その例に合わせて紹介します。
49 10 1 * * cd /home/okutani && /usr/local/rbenv/shims/ruby hello.rb
こうすることで、「毎月1日の10:49に、/home/okutaniへ移動後、hello.rbを実行する」といったことができるようになります。
今回、Rubyはrbenvで導入したものを利用しています。Rubyの実行ファイルまでのパスは、次のようにwhichコマンドで調べることができます。
$ which ruby
/usr/local/rbenv/shims/ruby
もしくは、cron登録時にRuby本体のあるパスを追加してあげればOKです。ここらへんの記述の仕方はお好みでどうぞ。
PATH=$PATH:/usr/local/rbenv/shims:/usr/bin
49 10 1 * * ruby /home/okutani/hello.rb
PATHに追加している「/usr/bin」は、「/usr/bin/env: bash: No such file or directory」とエラーが出てしまったので今回追加しています。
今回は、現在時刻を吐き出すhello.rbを次のように作成。
require "date"
d = DateTime.now
File.open('hello-ruby.txt', 'w') do |file|
file.puts(d.strftime("%Y%m%d %H%M%S"))
end
「~/hello-ruby.txt」を確認して、現在時刻が記述されていればOKです。
これで、cronを使ってRubyプログラムを定期実行することができました。
cronのサンプル集
よく使いそうな登録方法をいくつか紹介しておきます。
1分ごとに実行
* * * * * /bin/bash ~/hello.sh
または
*/1 * * * * /bin/bash ~/hello.sh
1時間ごとに実行
0 */1 * * * /bin/bash ~/hello.sh
毎時30分に実行
30 * * * * /bin/bash ~/hello.sh
毎時10, 20, 40分に実行
10,20,40 * * * * /bin/bash ~/hello.sh
毎月5日の4:12に実行
12 4 5 * * /bin/bash ~/hello.sh
毎年8/10 18:42に実行
42 18 10 8 * /bin/bash ~/hello.sh
毎週木曜日の14:02に実行
2 14 * * 4 /bin/bash ~/hello.sh
毎日10時5分、11時5分、12時5分、13時5分に実行
5 10-13 * * * /bin/bash ~/hello.sh
これで、好きな時刻にプログラムを実行することができますね。
まとめ
cronを使って、シェルスクリプトとRubyプログラムを定期実行する方法について解説しました。
「-e」の登録は「-r」と削除オプションと近い位置にあるため、エイリアスを貼ったり、別ファイルから登録するように心がけましょう。
cronではほぼほぼPATHは引き継がれないため、cron登録時にあらためてセットする必要がありました。もしくは、実行ファイルのフルパスを記述してもOKです。
もし、cronがうまく動かない場合は「/var/spool/mail/ユーザー名」などにあるファイルを確認すると解決するかもしれません。動かなくて困ったときは確認しておくと良いですね。
また、実行時間は5時ジャストなどではなく、5時4分などの中途半端な時間にしておくことが望ましいです。こうすることで、他の処理と同時に処理が走ることを極力防ぐことができるからです。
cron設定時の参考になれば幸いです。
参考サイト
今回参考にしたサイトはこちらです。
参考cron力をつけよう!全てのcrontab入門者に贈る9個のテクニック · DQNEO起業日記
参考くろんメーカ – crontabコマンドを自動で生成します。 そのままコピペしてお使いください。 · DQNEO起業日記
参考crontabの書き方 | server-memo.net
cronについてさらに深く知りたい方は、上の記事を一読してみてください。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク
PC用AdSense
PC用AdSense
こちらもどうぞ
- PREV
- フリーランス前の苦悩と焦燥感を吐き出してみる
- NEXT
- nginxでベーシック認証をかける方法