1.21 jigowatts

Great Scott!

cronでrbenvのRubyスクリプトを定期実行してみる

概要

前回作成したニュース配信のスクリプトをcronでスケジュール実行してみました。

sh-yoshida.hatenablog.com

環境

CentOS 7
Ruby: 2.3.1

cronの設定

cronについてはこちらの記事を参考にさせていただきました。
/etc/crontabと/etc/cron.d設定ファイルの書き方 | server-memo.net

crondが動作しているか確認
$ systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2016-10-14 05:28:49 JST; 1h 20min ago
 Main PID: 17173 (crond)
   CGroup: /system.slice/crond.service
           └─17173 /usr/sbin/crond -n

1014 05:28:49 CentOS systemd[1]: Started Command Scheduler.
1014 05:28:49 CentOS systemd[1]: Starting Command Scheduler...
1014 05:28:49 CentOS crond[17173]: (CRON) INFO (RANDOM_DELAY will be sc....)
1014 05:28:51 CentOS crond[17173]: (CRON) INFO (running with inotify su...t)
1014 05:28:51 CentOS crond[17173]: (CRON) INFO (@reboot jobs will be ru....)
Hint: Some lines were ellipsized, use -l to show in full.

Active: active (running)になっていれば大丈夫。
死んでたら起動しましょう。

$ sudo systemctl start crond
自動起動しているか確認
$ systemctl is-enabled crond
enabled

無効になってたら有効に。

$ sudo systemctl enable crond

スケジューリングの登録

rbenvのrubyを実行するのに、こちらの記事を参考にさせていただきました。
cronでrbenvのrubyを使う3つの方法 - sonots:blog


$HOME/news_mailディレクトリを作成し、ニュース配信のスクリプトを配置。毎日7時、12時、19時の3回実行するように設定しています。

$ crontab -e
0 7,12,19 * * * /bin/bash -lc 'cd $HOME/news_mail && ruby main.rb'

オプションの意味は

  • -lオプションで.bash_profileを読み込む。
  • -cオプションでコマンドをstringから読み込む。

詳しくはmanで確認できます。

$ man bash
スケジューリングの確認
$ crontab -l
0 7,12,19 * * * /bin/bash -lc 'cd $HOME/news_mail && ruby main.rb'

設定した値が表示されればOK。

ノートを閉じるとサスペンド状態になっちゃうので無効にする

CentOSはノートにインストールしてあるので閉じるとサスペンドされちゃってcronが動きませんでした。よって無効にしておきます。

こちらの記事に従って、logind.confを書き換えます。
CentOS7でノートPCを閉じてもサスペンドさせない - Qiita

HandleSuspendKey、HandleHibernateKey、HandleLidSwitchをコメントアウトしてignoreに。

$  sudo vim /etc/systemd/logind.conf

# == 省略 ==
#HandleSuspendKey=suspend
HandleSuspendKey=ignore
#HandleHibernateKey=hibernate
HandleHibernateKey=ignore
#HandleLidSwitch=suspend
HandleLidSwitch=ignore
# == 省略 ==

サービスの再起動。

$ sudo systemctl restart systemd-logind.service

あとは時間になるのを待つだけZzz..
一週間ほど運用してみましたが、今のところ安定稼動中です♪