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();
}
}