cronで使うコマンド

cronの設定項目について、少し例を書いておきます。
初めてcronを設定する方のためのコマンドです。

cronの設定項目

cronの記述は、
実行間隔(実行時間) コマンド
のようになります。
例えば、毎日7~8時台に10分おきに、/home/public/programs/run.shを実行する場合、
*/10 7-8 * * * /home/public/programs/run.sh
のように書きます。
*/10 7-8 * * * ⇒ 実行間隔
/home/public/programs/run.sh ⇒ コマンド
です。

実行間隔(実行時間)

分(0-59)
時(1-24)
日(1-31)
月(1-12) (jan-dec)
曜日(0-7、0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日)(sun-sat)
の順番で記述します。
分、時、日、月、曜日は半角スペースを開けて記述します。

実行間隔の設定方法はレンタルサーバーによってまちまちです。 わかりやすくしてある管理画面で簡単に設定できるところもあれば、crontabから設定しなければいけないところもあります。

全て

【*】は全てを表します。
* * * * *
は1分ごとに実行されます。

0 * * * *
毎時0分に実行されます。

30 2 * * *
毎日2時30分に実行されます。

20 7 1 1 *
毎年1月1日の7時20分に実行されます。

30 6 * * 6
毎週土曜の6時30分に実行されます。

リスト

【,】で区切って並べます。
17 6,18 * * *
6時17分と18時17分に実行されます。

0,5,10,15,20,25,30,35,40,45,50,55 * * * *
5分毎に実行されます。

間隔

【/】は毎を表します。
上の5分毎は、
*/5 * * * *
と書くこともできます。

0 */2 * * *
2時間おきに0分になったら実行されます。

2-56/6 * * * *
2分から始まって6分おきに実行されます。つまり毎時2分、8分、14分、20分、26分、32分、38分、44分、50分、56分に実行されます。

範囲

【-】は間を表します。
* 7-8 * * *
7時台と8時台に毎分実行されます。

0-30/10 3 * * *
3時台の0~30分の間10分おきに実行されます。つまり3時0分、3時10分、3時20分、3時30分に実行されます。

25 2,5,7-10 * * *
2時、5時、7時~10時の25分に実行されます。つまり、2時25分、5時25分、7時25分、8時25分、9時25分、10時25分に実行されます。

コマンド

スクリプトファイルを実行

スクリプトファイルを実行したい場合、普通はスクリプトファイルへの絶対パス(フルパス)をコマンドに書けば大丈夫です。
10分おきに【/home/public/programs/run.php】を実行したい場合、
*/10 * * * * /home/public/programs/run.php
となります。
ですが通常は実行する言語のパスも記述します。 【run.php】はPHPで書かれているので、PHPへのパスも加えます。PHPのパスが【/usr/local/bin/php】の場合、
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php
となります。
【/usr/local/bin/php】にPHPがインストールされているので、この言語を使って実行しますという意味です。

【/usr/local/bin/php】はレンタルサーバーによって違いますので、お使いのレンタルサーバーをご確認ください。

またPHPのバージョンによってもパスは異なってきます。例えば、PHP5.5へのパスは【/usr/local/bin/php55】、PHP7.0へのパスは【/usr/local/bin/php70】などです。
スクリプトをPHP5.5で動かしたい場合は
*/10 * * * * /usr/local/bin/php55 /home/public/programs/run.php
スクリプトをPHP7.0で動かしたい場合は
*/10 * * * * /usr/local/bin/php70 /home/public/programs/run.php
などのようにPHPのバージョンも指定することができます。
PHPの例を書きましたが、他の言語でも同じです。

もしPHPで【/home/public/.php/php.ini】を指定して実行したい場合、
*/10 * * * * /usr/local/bin/php70 -c/home/public/.php/php.ini /home/public/programs/run.php
と書きます。

ディレクトリの移動

スクリプトファイル内で他のファイルを読み込んでいるのに、読み込みファイルへのパスが相対パスであったりディレクトリの移動がされていなかったり、何らかの理由でそれらがうまく動作していない事があり、読み込みファイルがないというエラーが出ることがあります。

この場合はcron側でディレクトリを移動させる必要があります。
【/home/public/programs/run.php】を実行する場合、【/home/public/programs】ディレクトリへ移動してから【run.php】を実行します。
*/10 * * * * cd /home/public/programs ; /usr/local/bin/php run.php
【cd /home/public/programs】 ⇒ /home/public/programsディレクトリへ移動
【;】 ⇒ 移動が成功しても失敗しても
【/usr/local/bin/php run.php】 ⇒ 言語【/usr/local/bin/php】で【run.php】を実行
という意味です。

バックアップや最適化を行う

今まではスクリプトフィアルを動かすことを想定して書いてきましたが、cronで動かすのはスクリプトファイルだけではありません。
インターネットビジネスで使いそうなのは、データベースのバックアップや最適化などでしょう。
人気のWordPressなどでもデータベースを使っていますので、定期的にバックアップと最適化する必要が出てくるかもしれません。 レンタルサーバー側でバックアップを取ってくれていたり、データベースやスクリプト側で最適化してくれていたりするので確認してみてください。

MySQL 最適化
mysqlcheck -o [データベース名]
データベースにあるテーブル全部を最適化します。
cronから実行する場合は、mysqlcheckコマンドはフルパスで指定します。パスはお使いのレンタルサーバーに確認してください。

MySQL バックアップ
mysqldump --opt [データベース名] > [バックアップファイル名]
データベース全体をファイルにバックアップします。
cronから実行する場合は、mysqldumpコマンドはフルパスで指定します。パスはお使いのレンタルサーバーに確認してください。

PostageSQL バックアップ
pg_dump [データベース名] > [バックアップファイル名]
などです。データベースにあるテーブル全部を最適化します。
cronから実行する場合は、pg_dumpコマンドはフルパスで指定します。パスはお使いのレンタルサーバーに確認してください。

出力破棄は慎重に

*/10 * * * * /usr/local/bin/php /home/public/programs/run.php > /dev/null 2>&1
のようにコマンドの最後に【 > /dev/null 2>&1】を付けて、標準エラー出力と標準出力を破棄している場合があります。
この記述をすると、後述するメールでの実行結果の受け取りができなくなりますので、最低でも安定稼働が確認できるまでは付けないことを強くお勧めします。

安定稼働後は動作の度に結果がメールで送られてくるのは煩わしいかもしれません。 ですがサーバーの環境に変化などがあって、いつエラーが起こるかわかりません。エラーだけは破棄せず受け取れるように設定されることをお勧めします。
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php 1>/dev/null
こうすることで標準出力は破棄しますが、エラー出力はメールで送信してくれるのでエラーが起こったことをいち早く知ることができ、すぐに対応ができます。

メールで結果の受け取りを

cronの標準出力と標準エラー出力(実行結果)をメールで受け取ることができます。
この設定もレンタルサーバーによってまちまちです。管理画面のcron設定からメールアドレスを入力するだけで良いところもありますし、crontabから記述しなければいけないところもあります。

crontabから設定する場合、
【MAILTO="メールアドレス"】
を加えます。【errres@sample.des】で結果を受け取りたい場合は、
MAILTO="errres@sample.des"
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php
のように書きます。当然ですが、メールアドレスはご自身の存在するメールアドレスにしてください。

上述した出力破棄は慎重にで書いた出力を破棄するコマンドを、もし書いていれば削除してください。 出力を破棄すると、メールへも送信されなくなります。
最低でも安定稼働が確認できるまではメールで実行結果を受け取ってください。
そうしないと、何が原因で動かないのか、どこを修正すればよいのかわかりません。

セキュリティなどの観点からエラー出力を行わないスクリプトもあります。この場合メールアドレスを設定しただけでは、cronが動いているかどうかわからないこともありますので、echoを吐かせてみるといいでしょう。
MAILTO="errres@sample.des"
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php & echo "hello"
これでcronが実行されていればerrres@sample.desにhelloと送られてきます。

ファイルへの出力

出力破棄は慎重にメールで結果の受け取りをとも関係しますが、cronの実行結果をメールではなく、ファイルへ保存することも可能です。いわゆるログファイルになります。
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php 1>/home/public/programs/normal.txt 2>/home/public/programs/error.txt
とすれば、標準出力は【/home/public/programs/normal.txt】へエラー出力は【/home/public/programs/error.txt】へ書き込まれまます。

ログファイルを上書きではなく、追記したい場合は、
*/10 * * * * /usr/local/bin/php /home/public/programs/run.php 1>>/home/public/programs/normal.txt 2>>/home/public/programs/error.txt
と書きます。
追記する場合、ファイルサイズがどんどん大きくなりますので、定期的にファイルを整理してください。ログローテートはかなりハードルが高いので、追記はあまりお勧めしません。