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
-
$WORKSPACE
:build.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();
}
}