このページでは、実行日時を指定したコマンドをWebサーバに発注するcronの使い方を説明します。
Webページでのカウントダウン、リマインダーメール、ログの自動保存、ファイルのバックアップなどに利用できます。
シェルスクリプトやPHPの書き方を知らなくても、必要な箇所だけを修正してテンプレートとして使うことができます。
cronはUNIX(Linux)系のOSで定期的にコマンドを実行する仕組みです。cronを使うと、その時点にPCを操作せずとも、あらかじめコマンドを発注しておくことができます。cronが使えるWebサーバでは、以下のようなことができます。
[C] 定期的にログやバックアップを保存する。
cronは指定された日時にLinuxコマンドで書かれたシェルスクリプトを読み込みます。このため、cronを利用するためにはLinuxコマンド等を学ぶ必要があります。しかし、限られた用途とはいえLinuxコマンドをゼロから学ぶのは面倒です。このページにはLinuxコマンドやメール送信用PHPのテンプレートをおいてあります。Linuxコマンドを知らない方でも、必要な部分を書き換えることで、cronを利用して上記の[A][B][C]を行うことができます。
代表的な格安サーバでcronが使えるものとしてXREA(エクスリア) のXREA+[年間2400円位]やさくらインターネットのレンタルサーバ:スタンダード[年間5000円位]があります。大学や会社のサーバでcronを使いたい場合は、管理者に尋ねてみてください。
cronは指定されたシェルスクリプトを指定された時間に実行します。Webサーバでの設定では、日時とシェルスクリプトを指定します。
日時指定にアスタリスクの[*]を入れると、その部分は[条件無し]という意味になります。
下の画像の日時設定で、毎日午前5時に実行します。
Webの更新、バックアップは基本的にファイルをコピー(同名ファイルがあれば上書き)するだけです。
コピーするLinuxコマンドは[cp]です。[cp A B]でAをBにコピーします。
例えば、『public_html』以下が公開ディレクトリとすると、非公開のディレクトリにある『new_index.html』を『public_html/index.html』に上書きコピーすると、Webサイトのトップページが変わります。この書き方は
#!/bin/sh # new_index.htmlを公開ディレクトリのindex.htmlに上書きコピー cp /username/new_index.html /username/public_html/index.html |
上記のコードをコピーして必要箇所を変更してからエディターの改行コードを[LF]にして保存しておきます。エディターの改行コードの選択は、フリーのエディターでもMKeditorやxyzzyで保存時に設定できます。拡張子は[txt]でも良いですが、シェルスクリプトであることを明示するため[sh]とつけておきます。
保存したシェルスクリプトおよび上書きするためのhtmlやファイルをWebサーバの非公開ディレクトリに上げておきます。cronでシェルスクリプトおよび日時設定をすれば、指定時間に該当htmlが上書きコピーされ更新されます。曜日毎のページを作り、更新することもできます。
指定日時が来たらWeb上から削除したいファイルの場合は[rm]というコマンドで削除することができます。 [rm A]でAというファイルを削除できます。公開ディレクトリ下の『temp.html』を削除したい場合は以下のように書きます。
#!/bin/sh rm /username/public_html/temp.html |
記念日や賀状メール、リマインダーなど指定日時にメールを送りたいという場合にもcronは使えます。メールを送信するシェルスクリプトの記述方法もありますが、日本語指定や複数行の書き方が面倒なので、PHPというプログラム言語を使って記述します。
以下のテンプレートの$mlsb〜mlbody;の必要箇所を変更して『auto_mail.php』として保存して下さい。
|
|
上のPHPを実行してメールを送信すると、example@destination.comに以下のようなメールが届きます。
メールのタイトル:自動送信のメールタイトル
差出人:cron_mail@sender.com
cronによるメール本文:↓
ここに複数行のメール本文を書いていきます。 メール本文にPHP内の変数を入れることもできます。 例えば上で定義した時刻変数を使って、 cronによる送信日本年月日:2006/03/16(Thu) cronによる送信日本時間:2006/03/16(Thu)09:00 とすると送信日や時間がメール本文に入ります。 |
PHP内に本文を書いた後は、サーバの設定に従って[サーバのPHP本体の位置 設置したPHPスクリプトの位置]で指定すれば、『auto_mail.php』が指定日時に実行されます。PHP本体がどこにあるか?は各サーバの設定に従って記載してください。XREAやさくらインターネットを含め、標準的な位置にある場合は以下のように書きます。
#!/bin/sh #PHP /usr/local/bin/php /username/auto_mail.php |
ログやバックアップの保存も基本的には用途AのWeb更新と同じで、コピーしていくだけです。ただ日付がファイル名に入った方が、ログの整頓が楽になります。シェルスクリプトの中でも関数を使うことができ、[`date '+%Y%m%d'`]と書けば、サーバ側で実行した日時をファイル名に書き込んでくれます。例えばコマンド実行時にサーバ内の時計で2006年4月1日であれば[20060401]と書き込んでくれます。その日のログファイルを日付入りのファイル名で保存するには、logというディレクトリを作り
#!/bin/sh cp /username/public_html/today.log /username/log/t`date '+%Y%m%d'`.log |
とシェルスクリプトを書きます。毎日cronを実行するよう設定すると『t20060401.log』『t20060402.log』『t20060403.log』と、日付入りのファイル名でログが作成され、logディレクトリ下に保存されます。定期的なファイルのバックアップも同様の要領で行えます。
ディレクトリを丸ごとバックアップしたい場合も、アスタリスク*を使って、一行で指定することができます。例えば、先に非公開ディレクトリに[backup_bbs]というディレクトリを作っておけば、以下のような指定方法で[public_html/bbs/]下のサブディレクトリを含めて、全てコピーしてbackup_bbs下にバックアップをとることができます。
#!/bin/sh cp -r /username/public_html/bbs/* /username/backup_bbs |
ログの保存は、コピー先のファイル名に日付を入れましたが、コピー元のファイル名に日付を入れることでWeb更新にも応用できます。あらかじめ『t20060401.html』、『t20060402.html』、『t20060403.html』というファイルを作っておき
#!/bin/sh cp /username/t`date '+%Y%m%d'`.html /username/public_html/index.html |
と書いて毎日cronを実行すると、ホームページが毎日自動更新され、カウントダウンなどをhtml上で行うことも可能です。
cronはもともとバックアップなどの定期実行の仕組みであるために、1年以内の指定しかできません。しかし日付入りのファイル名とシェルスクリプトを使うことで(サーバの設定が変わらなければ)10年先でも自動でファイルをコピーしたり上書きすることができます。htmlでのカウントダウンの要領で『t20200101.html』というhtmlを作っておき、毎年元旦にcronを実行するようにすると、(サーバの設定が変更されず、権利が保持できれば)2020年の元旦にhtmlを更新することも可能です。
Webページの更新と同様にPHPのファイル名に名称に日付を入れることもできます。『t20200101mail.php』として毎年元旦にcronを実行すれば、(2019年までは何も送らずに)2020年の元旦にメールを自動送信することも可能です。
#!/bin/sh #PHP /usr/local/bin/php /username/t`date '+%Y%m%d'`mail.php |
サーバの仕様維持や権利が長期間期待できるなら、
などができます。
cronの実行結果やエラーは通知メールが管理者に送信されます。XREA+の場合は登録メールアドレスに送信され、さくらインターネットの場合はpostmaster@***.sakura.ne.jpへ送信されます。この通知メールは、cronの指定に[/dev/null]を書き込こむことで操作できます。
通知メールに送信条件は、主に以下の3つのケースが考えられます。
[ケース1] cronが実行されたこと自体を確認したい。
⇒『エラーの有無にかかわらず、通知メールを出す。』
[ケース2] エラー通知も含め、全ての通知がいらない。
⇒『エラーの有無にかかわらず、通知メールを出さない。』
[ケース3] 正常動作すれば通知メールは送らないで欲しいが、エラーがあれば通知メールが欲しい。
⇒『エラーがあった場合のみ、通知メールを出す。』
それぞれのケースにおけるcronの記述方法は、以下の表のようになっています。
ケース | 通知方法の場合分け | cronの記述方法 | 説明 |
1 | エラーの有無にかかわらず、 通知メールを出す。 |
example.sh | [example.sh]の後に何も記述しない。 標準出力[1]とエラー出力[2]の両方をメールで通知する。(下にメモ) |
2 | エラーの有無にかかわらず、 通知メールを出さない。 |
example.sh >/dev/null 2>&1 | ([1]が省略された)標準出力はゴミ箱へ行き、 エラー出力[2]は標準出力[1]に出力先を合わせて、同様にゴミ箱へ行く。 |
3 | エラーがあった場合にのみ、 通知メールを出す。 |
example.sh >/dev/null | ([1]が省略された)標準出力はゴミ箱へ行くが、 エラー出力[2]に関しては標準設定のまま、通知メールを送る。 |
コピーの[cp]や削除の[rm]は、何もオプションを付けなければ、標準出力[1]すらありません。標準出力[1]とエラー出力[2]の両方がない場合は、[example.sh]の後に何も記述していなくても通知メールが送信されません。コピーや削除の実行結果を標準出力[1]に出すには、[cp -v]や[rm -v]と『-v』のオプションを付けます。『-v』を付けると正常動作した場合にも標準出力[1]に出力され、通知メールが送信されます。
[cp -v]、[rm -v]を使うと、どのファイルをコピー、削除したかが分かりますが、単にcronの動作確認メールを受け取りたい場合は、シェルスクリプトの最後にでも以下の一行を加えてください。
echo "The cron works on `date '+%Y/%m/%d %H:%M'`." |
他の出力がなければ、本文一行の通知メールが届きます。
The cron works on 2006/03/16 09:00. |