Ubuntu16.04LTS cronで定期的なプログラム実行

IT
この記事は約7分で読めます。

株式投資でしっかり稼ごうと思うと毎日、同じようなサイトで情報を収集し、株価のチャート、シグナルをチェックするということを繰り返す必要があります。

ただ、私は毎日同じことをコツコツ繰り返すのが非常に苦手なタイプなので、単純な作業はプログラムに任してしまいたいということになります。私がプログラミングなどを勉強するモチベーションは大抵これです。

これまでのブログで「株ドラゴンのランキングをスクレイピングしてくる」「株価をスクレイピングしてきて、チャートを描く」と行ったことをプログラム化してきましたが、今回はそのプログラムの実行も自動で定期的に行いたいと思った次第です。

ということで、UNIX系のOSに入っているバッチ処理サービスの一つであるcron(クーロン)を使って定期的なプログラム実行を行ったのですが、めちゃくちゃ躓いたのでブログに書き留めておきたいと思います。

cron導入で躓いた点

cronはUNIX系のOS(MacとかLinuxとか)に入っているプログラムのひとつです。
指示した時間に指定したプログラムを動かしてくれるもので、「プログラム 定期的 実行」みたいな感じでGoogle検索するとだいたい出てきます。

結構多くの人がcronについて書いてくれているのですが、色んな人が書いてくれているおかげで逆にめっちゃハマりました。

結論から言うとアホみたいな話なのですが、重要な点はUbuntu16.04LTSと18.04でcronサービスのコマンドが変わるです。

未だに16.04LTSを使っている私が悪いのかもしれませんがなかなか書いてくれている人がいなくてstack over flowでようやく気づきました。
Start crond.service on Ubuntu 16.04

cronサービスのコマンドには主に起動、ステータス確認、停止の3つがあるのですが、以下のようにUbuntu18.04と16.04で異なります。

#Ubunt18.04
$ sudo service crond start #cronの起動
$ sudo service crond status #cronのステータス確認
$ sudo service crond stop #cronの停止

#Ubuntu16.04
$ sudo service cron start #cronの起動
$ sudo service cron status #cronのステータス確認
$ sudo service cron stop #cronの停止

Ubuntu16.04でsudo service crond statusと実行しても以下のように’No such file or directory’とでてしまい、cronが起動しているのかどうかすら全然わかりません。

hoge@hoge-ubuntu:~$ sudo service crond status
● crond.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

私は、cronがそもそもインストールされていないのかな?とかcronを削除してしまったのかなとか色々悩んで時間を浪費してしまいました。

Ubuntu16.04でのcronの設定手順

環境

OS:Ubuntu 16.04 LTS

cronサービスの起動

まず、Linux上でcronを使用するためには、cronのサービスが起動していなければなりません。
上述の通りcronのサービス起動、ステータス確認、停止は以下のコマンドになります。

$ sudo service cron start #cronの起動
$ sudo service cron status #cronのステータス確認
$ sudo service cron stop #cronの停止

まずはsudo service cron statusでステータスの確認を行います。
起動していなければsudo service cron startで起動しましょう。

$ sudo service cron status #ステータスの確認
#停止している時
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
   Active: inactive (dead) since 日 2019-07-07 02:03:33 JST; 14h ago
     Docs: man:cron(8)
  Process: 7681 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TER
 Main PID: 7681 (code=killed, signal=TERM)

#起動している時
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2019-07-07 16:28:50 JST; 5s ago
     Docs: man:cron(8)
 Main PID: 16946 (cron)
    Tasks: 1
   Memory: 384.0K
      CPU: 991us
   CGroup: /system.slice/cron.service
           └─16946 /usr/sbin/cron -f

cronの設定

cronの設定は基本的にこちらのサイトを参考にしました。
Ubuntuでのcronの使い方

私もcron.dを用いるほうがよいと思うので、cron.dの内容を記述します。
上記のサイトとほぼ重複しますが、順番にコマンドを書いていきます。

cron.dに拡張子のないファイルcron_testをコピー

$ sudo cp /etc/crontab /etc/cron.d/cron_test

cron_testの編集

$ sudo vi /etc/cron.d/cron_test

私の元ファイルcron_tabにはコメントとSHELL=/bin/sh、PATHが記述されていました。
そこにコマンドを追記しました。
また、test.shの実行結果をcron.logに出力するようにしています。

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
# 10分ごとに実行する
*/10 * * * *   userA /bin/bash /home/userA/test/test.sh >> /home/userA/test/log/cron.log

test.shの作成

cron_testに/home/userA/test/にあるtest.shを実行するような記述をしていますので、/home/userA/にtestフォルダを作成し、test.shファイルを作成します。
最初は動作するか確認したいと思いますので、test.shには’hello world’を出力するように書いておきます。

echo 'hello world'

cron.logの作成、確認

cron_testに/home/userA/test/log/cron.logに結果を出力するように記述したので、logフォルダとcron.logファイルを作成します。

sudo service cron startを実行して、しばらく待つとcron.logにhello worldと記述されているはずです。

$ cat /home/userA/test/log/cron.log
>> hello world

以上、役に立った場合は下のボタンをポチっとしてもらえると嬉しいです。

タイトルとURLをコピーしました