[cronによる日時指定のWeb更新、メール送信] はてなブックマークに追加

このページでは、実行日時を指定したコマンドをWebサーバに発注するcronの使い方を説明します。
Webページでのカウントダウン、リマインダーメール、ログの自動保存、ファイルのバックアップなどに利用できます。
シェルスクリプトやPHPの書き方を知らなくても、必要な箇所だけを修正してテンプレートとして使うことができます。


Webサーバでのcron利用

cronはUNIX(Linux)系のOSで定期的にコマンドを実行する仕組みです。cronを使うと、その時点にPCを操作せずとも、あらかじめコマンドを発注しておくことができます。cronが使えるWebサーバでは、以下のようなことができます。

[A] Webページやファイルを日時指定で更新、公開、削除する。
使用例1: 元旦や誕生日に専用のWebページに更新する。Web上でカウントダウンする。
使用例2: 期限付き公開ファイルを日時指定して公開、削除する。
[B] 日時を指定してメールを送る。
使用例1: 誕生日や記念日、スケジュールのリマインダーをメールを送信する。
使用例2: 数年後の自分や他人にメールを出す。(1年以上先のcron指定方法は後述

[C] 定期的にログやバックアップを保存する。

使用例1: ファイル名に日付をいれて、ログを長期的に残していく。
使用例2: ファイルやディレクトリ(フォルダ)のバックアップを作っておく。

cronは指定された日時にLinuxコマンドで書かれたシェルスクリプトを読み込みます。このため、cronを利用するためにはLinuxコマンド等を学ぶ必要があります。しかし、限られた用途とはいえLinuxコマンドをゼロから学ぶのは面倒です。このページにはLinuxコマンドやメール送信用PHPのテンプレートをおいてあります。Linuxコマンドを知らない方でも、必要な部分を書き換えることで、cronを利用して上記の[A][B][C]を行うことができます。


cronの利用可能サーバ

代表的な格安サーバでcronが使えるものとしてXREA(エクスリア) のXREA+[年間2400円位]やさくらインターネットのレンタルサーバ:スタンダード[年間5000円位]があります。大学や会社のサーバでcronを使いたい場合は、管理者に尋ねてみてください。

XREAのcron設定画面
Xrea+のcron設定画面
さくらインターネットのcron設定画面
さくらインターネットのcron設定画面

cronは指定されたシェルスクリプトを指定された時間に実行します。Webサーバでの設定では、日時とシェルスクリプトを指定します。
日時指定にアスタリスクの[*]を入れると、その部分は[条件無し]という意味になります。

下の画像の日時設定で、毎日午前5時に実行します。

ron設定画面でアスタリスクを入れると、その項目は無条件になる。


cronの用途A:Webの日時指定更新

Webの更新、バックアップは基本的にファイルをコピー(同名ファイルがあれば上書き)するだけです。
コピーするLinuxコマンドは[cp]です。[cp A B]でAをBにコピーします。

例えば、『public_html』以下が公開ディレクトリとすると、非公開のディレクトリにある『new_index.html』を『public_html/index.html』に上書きコピーすると、Webサイトのトップページが変わります。この書き方は

index_update.sh
#!/bin/sh
# new_index.htmlを公開ディレクトリのindex.htmlに上書きコピー
cp /username/new_index.html /username/public_html/index.html

上記のコードをコピーして必要箇所を変更してからエディターの改行コードを[LF]にして保存しておきます。エディターの改行コードの選択は、フリーのエディターでもMKeditorxyzzyで保存時に設定できます。拡張子は[txt]でも良いですが、シェルスクリプトであることを明示するため[sh]とつけておきます。

MKeditorでの保存
MKeditorの保存時の改行設定

保存したシェルスクリプトおよび上書きするためのhtmlやファイルをWebサーバの非公開ディレクトリに上げておきます。cronでシェルスクリプトおよび日時設定をすれば、指定時間に該当htmlが上書きコピーされ更新されます。曜日毎のページを作り、更新することもできます。

さくらインターネット用の属性変更(FFFTP)
さくらインターネット用の実行権限の追加

指定日時でファイルを消去

指定日時が来たらWeb上から削除したいファイルの場合は[rm]というコマンドで削除することができます。 [rm A]でAというファイルを削除できます。公開ディレクトリ下の『temp.html』を削除したい場合は以下のように書きます。

remove_temp.sh
#!/bin/sh
rm /username/public_html/temp.html

cronの用途B:メールの日時指定送信

記念日や賀状メール、リマインダーなど指定日時にメールを送りたいという場合にもcronは使えます。メールを送信するシェルスクリプトの記述方法もありますが、日本語指定や複数行の書き方が面倒なので、PHPというプログラム言語を使って記述します。

以下のテンプレートの$mlsb〜mlbody;の必要箇所を変更して『auto_mail.php』として保存して下さい。

変数名 内容
mlsb メールのタイトル
mlto 宛先となるメールアドレス
mlfr 差出人のメールアドレス
mlmes メールの本文 (<<<mlbodymlbody;の間に書く)
auto_mail.php
<?php
$tim = time();
$today = gmdate("Y/m/d(D)",$tim+9*60*60);
$now = gmdate("Y/m/d(D)H:i",$tim+9*60*60);

$mlsb = "自動送信のメールタイトル";
$mlto = "example@destination.com";
$mlfr = "cron_mail@sender.com";
$mlmes = <<<mlbody
 ここに複数行のメール本文を書いていきます。

 メール本文にPHP内の変数を入れることもできます。
例えば上で定義した時刻変数を使って、
cronによる送信日本年月日:$today
cronによる送信日本時間:$now
とすると送信日や時間がメール本文に入ります。
mlbody;

mb_language("Japanese");
mb_internal_encoding("SJIS");
mb_send_mail($mlto,$mlsb,$mlmes,"From:$mlfr");
?>

上の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やさくらインターネットを含め、標準的な位置にある場合は以下のように書きます。

mail_send.sh
#!/bin/sh
#PHP
/usr/local/bin/php /username/auto_mail.php

cronの用途C:日付をファイル名にしたログ等の保存

ログやバックアップの保存も基本的には用途AのWeb更新と同じで、コピーしていくだけです。ただ日付がファイル名に入った方が、ログの整頓が楽になります。シェルスクリプトの中でも関数を使うことができ、[`date '+%Y%m%d'`]と書けば、サーバ側で実行した日時をファイル名に書き込んでくれます。例えばコマンド実行時にサーバ内の時計で2006年4月1日であれば[20060401]と書き込んでくれます。その日のログファイルを日付入りのファイル名で保存するには、logというディレクトリを作り

everyday_log.sh
#!/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下にバックアップをとることができます。

backup_bbs.sh
#!/bin/sh
cp -r /username/public_html/bbs/* /username/backup_bbs

htmlでのカウントダウン

ログの保存は、コピー先のファイル名に日付を入れましたが、コピー元のファイル名に日付を入れることでWeb更新にも応用できます。あらかじめ『t20060401.html』、『t20060402.html』、『t20060403.html』というファイルを作っておき

everyday_update.sh
#!/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年の元旦にメールを自動送信することも可能です。

mail_jan1st.sh
#!/bin/sh
#PHP
/usr/local/bin/php /username/t`date '+%Y%m%d'`mail.php

サーバの仕様維持や権利が長期間期待できるなら、

などができます。


cronの通知メール

cronの実行結果やエラーは通知メールが管理者に送信されます。XREA+の場合は登録メールアドレスに送信され、さくらインターネットの場合はpostmaster@***.sakura.ne.jpへ送信されます。この通知メールは、cronの指定に[/dev/null]を書き込こむことで操作できます。

通知メールに送信条件は、主に以下の3つのケースが考えられます。

[ケース1] cronが実行されたこと自体を確認したい。
    ⇒『エラーの有無にかかわらず、通知メールを出す。』

[ケース2] エラー通知も含め、全ての通知がいらない。
    ⇒『エラーの有無にかかわらず、通知メールを出さない。』

[ケース3] 正常動作すれば通知メールは送らないで欲しいが、エラーがあれば通知メールが欲しい。
    ⇒『エラーがあった場合のみ、通知メールを出す。』

それぞれのケースにおけるcronの記述方法は、以下の表のようになっています。

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]に出力され、通知メールが送信されます。

  • 『-v』のオプションはverbose(言葉数が多い、くどい、詳細な)の頭文字です。
  • 用途Bのメール送信では、[Content-type: text/html]という本文の通知メールが届き、cronの動作が確認できます。機械的な標準出力ではなく、cronの正常動作メールであることを明記したい場合は、mail_send.shに当たるシェルスクリプトに以下のechoを足しておきます。

[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.