Posted at

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

More than 3 years have 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();
}
}