2019-08-15

crontab を使う

crontab は、Unix 系オペレーティングシステムにおいて、指定コマンドを定時実行するためのスケジュール管理を行うコマンドです。

Wikipedia より抜粋、修正

この夏期休暇に自宅で常時稼動させるサーバーを立てようと、Amazon.jp からファンレスの格安小型 PC [1] を買って使い始めています。OS はとりあえず CentOS 7 をインストールしました [2]。必要な設定が終わり、いよいよ自作アプリケーションのデータを自動更新するため、crond サービスを利用する段階になりました。

参考資料 [3] を見ながら、crontab コマンドで毎日午後 8 時に更新用のプログラムが起動するように設定しました。

crontab でジョブスケジュール設定後の確認 
[bitwalk@centos7-pc ~]$ crontab -l
0 20 * * * /home/bitwalk/shiny-app/stock-explorer/support/update.sh
[bitwalk@centos7-pc ~]$ 

ディレクトリ名を見ての通り、これは Shiny のアプリケーションで、データベース更新のため R のバッチプログラムを定期的に動かします。crontab の設定で直接コマンドを記述しても良かったのですが、なにかと細かな変更の実行確認がしやすいし git で履歴管理できるという理由で、bash 用のスクリプトファイルを用意して、そこに R CMD BATCH ... を記載しています。

指定時刻にジョブが起動したことを htop で確認、非力な CPU ですが、それでも約 20 分後に計算が終了、アプリケーションのデータが更新されていることを確認できてメデタシメデタシなのですが…、

実行したジョブのログ 
[bitwalk@centos7-pc ~]$ tail update.Rout
  70     99.23493  0.9691623  72.76109

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 70.
          Date   Code  Predict
155 2019-08-14 9984.T 4981.734
[1] "insert into rf values(18122, '2019-08-14', 2123.54933333333, 2346.01436666667, 282.723566666667, 2139.61413333333, 1051.35863333333, 1412.6698, 2677.06021666667, 1491.37915, 24362.1283333333, 2618.8785, 4981.7339);"
> proc.time()
   ユーザ   システム       経過  
    97.566      1.664   1089.813 
[bitwalk@centos7-pc ~]$ 

crontab コマンドで設定した内容はどこ?

crontab -e で設定した内容はどこに格納されているのでしょうか?ユーザーディレクトリ内を探してもそれらしいファイルがありません。いろいろ調べてみると、参考サイト [4] に説明がありました。/var/spool/cron/アカウント名 にあります。

念の為ということでもないのですが、自力で確認しきれなかったのが悔しくて、crontab コマンドが含まれているパッケージ (cronie) が管理しているディレクトリも確認しました。

crontab の設定保存先 
[bitwalk@centos7-pc ~]$ rpm -qf /usr/bin/crontab
cronie-1.4.11-20.el7_6.x86_64
[bitwalk@centos7-pc ~]$ rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
...
(省略)
...
/usr/share/man/man8/crond.8.gz
/var/spool/cron
[bitwalk@centos7-pc ~]$ ls /var/spool/cron
ls: ディレクトリ /var/spool/cron を開くことが出来ません: 許可がありません
[bitwalk@centos7-pc ~]$ sudo ls /var/spool/cron
[sudo] bitwalk のパスワード:
bitwalk
[bitwalk@centos7-pc ~]$ sudo cat /var/spool/cron/bitwalk
0 20 * * * /home/bitwalk/shiny-app/stock-explorer/support/update.sh
[bitwalk@centos7-pc ~]$ 

ちなみに、crond サービスを利用できる(できない)ユーザーは、/etc/cron.allow/etc/cron.deny にユーザー名を記載して管理します。この CentOS 7 の cronie パッケージの設定のように、/etc/cron.allow が無くて、空の /etc/cron.deny が存在する場合は、このシステムの全てのユーザーが crond サービスを利用できます。つまり crontab コマンドで自動処理のスケジュールを設定できるということです。

本記事のように個人ユースで使うサーバーならともかく、複数のユーザーがアクセスする環境では、ユーザーが使用できる crond サービスの適用範囲ついてはルールを決めて運用する必要があります。

参考サイト

  1. bitWalk's: Skynew m2s (1) [2019-08-03]
  2. bitWalk's: Skynew m2s (2) [2019-08-04]
  3. Linuxコマンド【 crontab 】cronの設定 - Linux入門 - Webkaru
  4. Linux crontab command help and examples

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: