vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです。月間13万PV〜。

cronでシェルスクリプトとrubyプログラムを定期実行させる

      2017/01/31

LINEで送る
Pocket

cron-shell-ruby
こんにちは、okutani(@okutani_t)です。Linuxにある「cron」という機能を使うと、特定のプログラムを定期的に実行することができます。

本記事では「シェルスクリプト」と「Rubyプログラム」を定期的に実行する方法を解説しています。

今回は動作環境に、Vagrantで立ち上げたCentOS7を利用しています。また、Rubyはrbenvを使って導入しています。詳しく知りたい方は下記記事をそれぞれ参考にしてください。

『Vagrant Cloud』を利用してVagrantのBoxを追加してみよう
こんにちは、okutani(@okutani_t)です。Vagrant1.5以降では「Vagrant Cl...
2016-02-09 17:46
はてブ
rbenvを使って複数バージョンのrubyを導入する
こんにちは、okutani(@okutani_t)です。rubyの導入方法のひとつに『rbenv』というツ...
2016-06-25 16:11
はてブ

では、さっそく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についてさらに深く知りたい方は、上の記事を一読してみてください。

この記事が気に入ったら
いいね ! しよう

Twitter で
LINEで送る
Pocket

okutani (@okutani_t) のヒトコト
cronは使いこなせればめちゃくちゃ便利ですね。これからはcronと仲良くやっていこうと思います(`・ω・´)

 - Ruby, UNIX

スポンサーリンク

PC用AdSense

PC用AdSense

Share
  • このエントリーをはてなブックマークに追加

  こちらの関連記事もどうぞ

『MeCab+natto』で形態素解析をカスタム辞書付きでおこなう方法

こんにちは、okutani(@okutani_t)です。「MeCab」を使うと形 …

UNIXコマンド超入門!基本的な操作をしてみよう (pwd, cd, touch, ls)

こんにちは、okutani(@okutani_t)です。本記事では、初心者向けに …

Ruby+nokogiriを使ってブログの過去記事をTwitterに投稿してみる

こんにちは、okutani(@okutani_t)です。本ブログ『vdeep.n …

UNIXコマンド超入門!「Macでターミナルを立ち上げる」からはじめてみよう

こんにちは、okutani(@okutani_t)です。この記事ではUNIXコマ …

rbenvを使って複数バージョンのrubyを導入する

こんにちは、okutani(@okutani_t)です。rubyの導入方法のひと …

Windowsターミナル環境に「Console2 + nyagos」を導入する

こんにちは、okutani(@okutani_t)です。Windowsで標準で搭 …

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。