Java
PHP
Linux
Jenkins

定期実行の手法3パターンとその活用例

More than 1 year has passed since last update.

1. 定期実行の手法3パターン

  • cronによる定期実行(crontabもしくはcron.dの活用)
  • Jenkinsによる定期実行
  • プログラムによる定期実行(while文とsleepメソッドの活用)

1-1. cronによる定期実行

crontabの使い方

  • crontab -e:edit。crontabファイルの編集。
  • crontab -l:list。crontabファイルの内容表示。
  • crontab -r:remove。crontabファイルの削除。

crontabファイルの書き方は下記の通り。

分 時 日 月 曜日 コマンド
設定可能な数値
0-59
0-23
1-31
1-12 or jan-dec
曜日 0-7 (0,7は日曜) or sun-sat
設定例 説明
リスト 0,15,30,45 カンマ区切りで複数条件指定
範囲 1-5 1,2,3,4,5と同義
共存 1,3,5-7 1,3,5,6,7と同義
間隔値 1-7/3 1,4,7と同義

crontab -eは推奨しません。個人的にはcron.dの使用をオススメします。

(参考URL)
▼crontab -e は「絶対に」使ってはいけない
http://d.hatena.ne.jp/ozuma/20120711/1342014448

cron.dの使い方

記述方法はcrontabと同様。

sudo vim /etc/cron.d/hogehoge
  • hogehogeファイルに実行したいコマンドを書けばOK!

cronの活用例

10分おきにroot権限でtest.phpを実行し、標準出力と標準エラー出力をログファイルに書き足す。

$ sudo vim /etc/cron.d/hogehoge

*/10 * * * * root php /path/to/test.php >> /var/log/hogehoge/fuga.log 2>&1
  • */10 * * * *:10分おき
  • root:root権限で実行
  • php /path/to/test.php:test.phpファイル実行
  • >>:出力をファイルの末尾に追加
  • /var/log/hogehoge/fuga.log:はき出し先のログファイル
  • 2>&1:標準出力と標準エラー出力を同じファイルに出力
  • おまけ:tail -f /var/log/hogehoge/fuga.logにより、ログの更新をリアルタイムにチェック出来る

2. Jenkinsによる定期実行

Jenkinsの使い方

  • ジョブを選択し「設定」をクリックすると、Jenkinsのジョブ設定が出来る
  • 「定期的に実行」にチェックを入れると、スケジュールの設定が可能となる
  • スケジュールの書き方はcronと同じ
  • 「シェルの実行」の欄に実行したいシェルスクリプトを書けばOK!

Jenkinsの活用例

毎日24:30(日本時間)にphpファイルを実行させ、結果をメールで送る。

30 15 * * *
  • 分 時 日 月 曜日:GMTの15時30分に毎日実行
  • 日本時間はグリニッチ標準時間(GMT)より9時間進んでいる
REPORT_DIR="$WORKSPACE"/target
mkdir -p "$REPORT_DIR"
/usr/bin/php /path/to/test.php > "$REPORT_DIR"/report.csv
DATE=`date +%Y/%m/%d`
cat "$REPORT_DIR"/report.csv | /bin/mail -s "${DATE} デイリーレポート" -r aa@hoge.co.jp -c bb@hoge.co.jp -c cc@hoge.co.jp dd@hoge.co.jp ee@hoge.co.jp
  • $WORKSPACEbuild.xml<workspace>に記述された環境変数
    • (例)/var/lib/jenkins/workspace/ジョブ名
  • $REPORT_DIR:僕が勝手に作った変数
  • /usr/bin/php /path/to/test.php > "$REPORT_DIR"/report.csv:phpスクリプトの実行結果をCSVファイルに書き出す
  • date +%Y/%m/%d:現在の日付を取得
  • メールコマンドについてはこちら参照

  • おまけ

    • $JENKINS_HOME/var/lib/jenkins
    • build.xmlのパス:$JENKINS_HOME/jobs/ジョブ名/builds/ビルド番号/build.xml

3. プログラムによる定期実行

php

while (1) {
    // 処理
    sleep(5 * 60); // 5分おき
}

Java

while (true) {
    // 処理
    try{
        Thread.sleep(5 * 60 * 1000); // 5分おき
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}