プログラムの自動実行にcronを使おう サンプルプログラム付きで設定も簡単

Pocket

今回はcronの設定方法の解説と、サンプルプログラムを例にcronで動かしてみようと思います。
当記事の対象者としましては以下のとおりです。

  • プログラムを定期的に自動実行させたい方
  • cronの設定方法を知りたい方
  • cronで動かせるプログラムの例を見たい方
  • 雨の日にズブ濡れになりたくない方(理由は後ほど紹介いたします)

どうぞ最後までよろしくお願いいたします。

cronとは

cronとは、LinuxやMacOSに入っているアプリケーションの一つで、cronを使用するとプログラムを定期的に自動実行させることが可能となります。

cronの設定方法

cronでプログラムをいつ動かすかの指示は、crontabというコマンドを使用して記述していきます。

Linuxだったらサーバ内で、MacOSでしたらターミナルコマンドで crontab -e を入力します。viが立ち上がりcronの設定を入力する画面へと移ります。

cronの設定は実行時間と実行させたいジョブに半角スペースを空けて記載します。

実行時間は分・時・日・月・曜日を指定しそれぞれにも半角スペースを空けます。

例えば、天気予報メール送信プログラム(/home/sv01/tenki.php)を毎朝7時に送信したい場合、以下のように設定をしました。

0 7 * * * /home/sv01/tenki.php

分=0、時=7、と指定しましたので7時00分に実行させるという意味となります。

また、日・月・曜日を * にしましたので、毎日・毎月・毎曜日に実行されます。つまり、毎日7時00分に実行となります。

複雑な設定方法

毎日9時と12時の2回実行させたい場合

カンマ区切ると複数の指定を行うことができます。

0 9,12 * * * php /home/sv01/tenki.php

毎日13時〜18時まで毎時間実行させたい場合

ハイフンを使うと連続した指定を行うことができます。

0 13-18 * * * php /home/sv01/tenki.php

毎日12時と12時30分の2回実行させたい場合

スラッシュを使うと間隔の指定を行うことができます。以下の例だと分が*/30となっているため、30分に1回を意味します。

*/30 12 * * * php /home/sv01/tenki.php

毎日1時30分から3時間毎に実行させたい場合

今までの応用です。以下の例だと1時30分、4時30分、7時30分、10時30分、13時30分、16時30分、19時30分、22時30分に実行させれます。

30 1-22/3 * * * php /home/sv01/tenki.php

付録 天気予報メール送信プログラム

私は天気予報を見忘れて傘を持たずにでかけてしまうことがよくあります…。

なので、雨の日に傘を忘れぬよう、天気予報をメール送信するプログラムを作成しました。

天気予報の情報はlivedoor様のWeather Hacksというサービスが提供しているREST APIから取得します。サービスのURLに対して地域ID(city)をパラメータに乗せてリクエストすると、その地域の天気情報を取得できます。

サービスのURL

http://weather.livedoor.com/forecast/webservice/json/v1

宮崎県宮崎(南部平野部)の地域IDは450010

http://weather.livedoor.com/forecast/webservice/json/v1?city=450010

天気情報はJSONデータで取得できます。PHP言語でJSONデータを解析して、結果をメール送信するプログラムを下記のように作りました。

メール送信プログラム – tenki.php

<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
define("MAIL_TO", "ここにTOのメールアドレスを記入");
define("MAIL_FROM", "ここにFROMのメールアドレスを記入(サーバで使用できるメールアドレス)");

$result = WeatherHacks::getWeather(450010);

if($result !== array()){
    $title = $result['title'];
    $body = date("m月d日の天気予報",strtotime($result['datetime'])) . "\r\n" . $result['discription'];
    $header = "From:".mb_encode_mimeheader(mb_convert_encoding("天気予報","UTF-8","auto"))."<".MAIL_FROM.">";
    mb_send_mail(MAIL_TO, $title, $body, $header);
}

class WeatherHacks{
    /**
     * 天気予報情報を返す
     * @param integer $city_id 地域ID
     * @return array $resulte 取得失敗時は空の配列を返す
     */
    public static function getWeather($city_id){
        $result = array();
        if(false !== $json = self::getWeatherHacks($city_id)){
            $result['title']       = $json->title;
            $result['discription'] = $json->description->text;
            $result['datetime']    = $json->publicTime;
        }
        return $result;
    }

    /**
     * 天気予報情報をWeatherHacksより取得する
     * @param integer $city_id 地域ID
     * @return mixed 天気予報の情報をJSONで返す。取得できない場合はFALSEを返す。
     */
    private static function getWeatherHacks($city_id) {
        $url = "http://weather.livedoor.com/forecast/webservice/json/v1?city={$city_id}";
        if (false === $data = @file_get_contents($url)) return false;
        return json_decode($data);
    }
}

天気予報を家を出る毎朝7時に送信してほしいので、cronは以下のように編集します。

0 7 * * * php /home/sv01/tenki.php

実際に送られてくるメールは以下の通り。

これにて、傘を忘れないようになるかと思います。(天気予報が外れない限りは…。)

さいごに

いかがでしたでしょうか。cronを使用することでプログラムを定期的に自動実行することが可能となります。

付録で紹介しました天気予報メール送信プログラムに関してはご自由にお使いください。それでは。