【Linux】cronでスクリプト定時実行を設定する

今回は備忘録もかねて、UNIX系OSに備わっている「cron(クロン)」についてまとめていきます。

 

cronとは?

cronとは、多くのUNIX系OSで標準的に利用される常駐プログラム(デーモン)の一種。

利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれます。

つまりcronがあれば、定期実行したいプログラムを自分で実行する必要がなくなるわけです。

ちなみにデーモンは、悪魔の[demon]ではなく、守護神の[daemon]の意味らしいです。

 

 

cronの設定方法

cronの設定方法は二つ。

  • crontabコマンドを使う
  • 管理者として/etc/crontabファイルを直接編集

 

crontabコマンド

crontabコマンドのオプションは次の三つ。

crontab -ecrontabファイルを編集する
crontab -lcrontabの内容を表示
crontab -rcrontabの内容を全削除

cronの書き方(crontabコマンド使用時)

実際のcronの記述方法は、crontab -eでcrontabファイルの編集画面に移動してから次のように記述します。

* * * * * [コマンド] [実行したいスクリプト]

の部分は左から[分] , [時] , [日] , [月] , [曜日]を設定します。

設定可能な数値は以下の通り。指定がない場合はを記述。

<設定項目><値>
0 – 59
0 – 23
1 – 31
1 – 12
曜日0 – 7(0=日, 1=月,・・・6=土)

具体的に書いてみる

いくつか具体例を示していきます。

スクリプトの場所はフルパス指定することに注意してください。

55 * * * * sh /var/sample/makedir.sh

毎時55分にmakedir.shを実行。

 

55 23 * * * sh /var/sample/makedir.sh

毎日23時55分にmakedir.shを実行。

 

0 7 * * 1 sh /var/sample/makedir.sh

毎週月曜の朝7時にmakedir.shを実行。

 

複数時間設定や、「~時間おき」という設定も可能です。

0 7,19 * * * sh /var/sample/makedir.sh

毎日、朝7時と夜19時にmakedir.shを実行。

 

*/10 * * * * sh /var/sample/makedir.sh

10分おきにmakedir.shを実行。

 

pythonファイルを実行する場合の注意点

pythonスクリプト(拡張子.py)実行の際、「手動で実行すると動くのにcronに設定すると動かない」ということが起こりえます。

解決策は、pythonコマンド(pythonの実行ファイルというべき?)のフルパスを指定してやること。つまり

* * * * * python /home/test.py
→ この設定で動かないときは、
* * * * * /home/tsukudan/anaconda3/bin/python /home/test.py
→ みたいな感じで、コマンドのフルパスも指定してやると動く。

 

pythonの実行ファイルのパスは、whichコマンドで確認可能です。

$ which python
/home/tsukudan/anaconda3/bin/python

 

こうしなければいけない理由はきちんと理解しきれていませんが、以下の記事が参考になるかもしれません。

目黒で働く分析担当の作業メモ

手動で実行すると動くのに、cronに設定すると何故か動かなくて結構苦労したのでメモ残します ・cronは$HOMEで実行…

 

/etc/crontabを直接編集

cronを設定する方法はもう一つあって、vimなどのエディターでetc直下のcrontabファイルを直接編集する方法です。

こちらの方法は以下の二つの理由で、初心者にはめんどくさい。

  • rootユーザーでなければ編集ができない
  • Vimなどのエディターは操作が面倒

なのであまり使うこともないかもしれませんが、念のための簡単に説明しておきます。

 

rootユーザーとして編集

「root」ユーザーは、「管理者権限」を持つユーザーのことで、全ユーザーの中の神的な存在。

すべての権限が付与されており、他のユーザーには決してできないような変更を行ったりできます。

詳しくはこちらの記事を参照。

エンジニアの入り口

LinuxのrootユーザとはLinuxの管理者のことだ。このページではrootユーザについて初心者の方向けにご紹介しよ…

 

普段僕たちは、権限が制限されている一般ユーザーとして操作しています。

そしてetcディレクトリ直下のcrontabファイル(/etc/crontab)は、一般ユーザーでは書き込みができないようになっています。

次のコマンドを打ち込んで、権限を確認してみましょう。

$ ls -l /etc/crontab
# 出力 -rw-r--r-- 1 root root 1095 Jun 29 10:49 /etc/crontab

出力された意味不明な記号については、以下の記事たちが参考になります。

猫のこたつ

【前提】 ユーザー名「kotatsu」で、サーバー「cat01」にいると仮定します。 最初に表示される[kotatsu@…

 

またwhoamiコマンドを使えば、今どのユーザーで操作しているのかを確認することができます。

$ whoami
# 出力 <ユーザー名>

 

crontabファイルを編集するために、rootユーザーに切り替えます。

次のコマンドを入力してください。

$ sudo su -

すると「<ユーザー名>@~」のような表記だったのが「root@~」に変わります。

 

もう一度whoamiコマンドを打ち込んでみましょう。rootユーザーに変更していることがわかります。

$ whoami
# 出力 root

 

この状態になって初めて、crontabファイルを編集することができます。

$ vim  /etc/crontab

 

エディター操作のだるさ

vim, emacs, nanoなどLinux向けのエディターは操作が面倒です。

なれれば逆に使いやすくなるのですが最初は「はぁ?」となります。

ここでは詳しく説明しないので、興味のある人は調べてみてください。

 

cronの書き方(/etc/crontabの編集時)

/etc/crontabを直接編集するときは、crontabを使用するときと少しだけ書き方が異なります。

違いはたった一つ。コマンドを実行するユーザー名を記述しなければいけません。

* * * * * [実行ユーザー名] [コマンド] [実行したいスクリプト]

 

現場からは以上です。

良いcronライフを。

最新情報をチェックしよう!