平成30/ 2018-12-14 11:07
Linux Crontab 2017.04.04.00

#### 前回との違い
(1) 1分前エラー取得で、エラー時の処理、前日も評価対象とする調整をした。
(2) Mysql Dump 追加
(3) 曜日を追加。



#### 曜日の書き方
#### 曜日を「0~7」(0,7は日曜日)または「sun~sat」で指定。ワイルドカード(*)を指定すると毎日。
0 sun
1 mon
2 tue
3 wed
4 thu
5 fri
6 sat
    -- 毎週金曜日だけ5分毎で実行。
*/5 * * * 5 /usr/bin/python test.py > /tmp/test.log 2>&1



#### Mysql Dump
0 4  * * mysqldump -uUSER -pPASSWORD DBNAME --default-character-set=utf8 > /home/backup/`date +DBNAME.\%Y\%m\%d.\%H\%M`.sql



#
#### 1分前のエラー取得
#
# (1) LANG=C しないと、Mar が3月とかになる。  
# (2) Crontabでは % をエスケープしないといけません。
# (3) CentOS7 で操作確認済み
# (4) /bin/mail をテストしたいときは、ちゃんと Body部分を入れないと送信されない
# (5) 以下のように、日付をファイル名にしている場合、ログローテートのタイミングで、日付のファイルがマッチせず、エラーがでるので、エラーを削除し、前日のログに最新がある可能性あるため評価している。コマンドが長くなっちゃうのでシェルにした方が分かりやすいかも。
#  

#### Now
*    * * * * export LANG=C;grep -h "`date '+ \%b \%d \%H:\%M:' -d '1 minutes ago'`" /var/log/httpd/zz.jp/error_log.`date +\%Y\%m\%d` 2>/dev/null | /bin/mail -E -s "`echo "zz.jp: debug" | tr "[:lower:]" "[:upper:]"`" "shimizu@zz.jp" 2>/dev/null
#### 1day ago
*    * * * * export LANG=C;grep -h "`date '+ \%b \%d \%H:\%M:' -d '1 minutes ago'`" /var/log/httpd/zz.jp/error_log.`date +\%Y\%m\%d -d '1 day ago'` 2>/dev/null | /bin/mail -E -s "`echo "zz.jp: debug" | tr "[:lower:]" "[:upper:]"`" "shimizu@zz.jp" 2>/dev/null










~~~~ 実行時のログをメールで受け取りたい場合。
  全角メールの文字化けしないように、ヘッダーも指定してあげている。

CONTENT_TYPE=text/plain; charset=UTF-8
MAILTO=zz@zz.jp



~~~~ コメントアウトする場合。
#0,8,16,24,32,40,48,56 * * * * php -d max_execution_time=420 /home/xxx/bat/xxx.bat.php



~~~~ 指定したディレクトリのファイルが、999ファイルを超えたら削除する

0 3 * * * find /home/www/log -type f | xargs ls -t | tail -n+1000 | xargs --no-run-if-empty rm -r



////////////////////////////////////// 1分前のエラーログをメールで報告する

* * * * * export LANG=C; grep "`date '+ \%b \%d \%H:\%M:' -d '1 minutes ago'`" /var/log/httpd/zz.jp/error_log | /bin/mail -E -s "`echo "$(hostname): debug" | tr "[:lower:]" "[:upper:]"`" "shimizu@zz.jp" > /dev/null 2>&1

crontab で「 % 」は使えないので「 \ 」でエスケープすること。
----
「 -E 」オプションが無いと、出力が無い場合にメールが飛んでしまう。
----
/dev/null 2>&1 が無いと「 Null message body; hope that's ok 」が出力されたのだが「 -E 」オプションつければ出ないかも。


////////////////////////////////////// Crontab のコマンドに改行は使えないみたい。


////////////////////////////////////// コマンドに、「 % 」がある場合は「 \ 」でエスケープすること。「 \% 」のように。


///////////// 日付の注意点
日付の部分を、*/2 として2日ごとにスケジューリングさせたい場合、
当月が、31日が末尾の場合は、31、翌月の1日 の2日間が実行されなくなるので工夫が必要。


////////////////////////////////////// コメントアウト
#
です。


----------
バッチからのメールが文字化けするときは、crontab に以下を記述
----------
LANG=ja_JP.utf8
* * * * * sh /root/bat/security_mail.sh

----------
ディレクトリのバックアップを取る例
----------
46 10 * * * cp -a /opt/bitnami/apache2/htdocs /home/bitnami/bkup/htdocs_`date +\%Y\%m\%d_\%H\%M\%S`
% を、\% としてエスケープ忘れないように。
秒(%S)はいらないと思うが念の為。


----------
確認していないが、以下のように環境変数を利用してバックアップできる
セミコロン使うことで、コマンドの複数記述が可能になる
----------
crontab -e
-
NOW = date xxcadfad
* * * * * cd /home/zz.jp/www; tar xxx /home/zz.jp/bkup/htdocs_$NOW.tar.gz htdocs
* * * * * cd /home/zz.jp/bkup; mysqldump > $NOW.dmp.sql; gzip $NOW.dmp.sql
* * * * * tmpwatch -m 240 /home/zz.jp/bkup

tmpwatch -mt 240 /home...
-mtオプション使うことで削除対象の確認ができる。
-m には時間を設定する。240の場合は240以上古いファイルが削除対象。
-
削除は他に以下の方法がある。
一か月分残したい場合は、
find /path/to/log -name '*.log' -mtime +30 -delete
-delete コマンドがなければ、
find /path/to/log -name '*.log' -mtime +30 -exec rm {} \;



|
| 1週間おきに実行したいとき
>>
0 2 * * 0 php -d max_execution_time=420 /home/xxx/bat/xxx.bat.php
<<
5番目の数値を設定するといい、上記の場合は、
毎週日曜日の午前2時に実行。




____ 標準出力を削除
*/8 * * * * php /home/xxx/bat/xxx.bat.php 1> /dev/null
-
1> /dev/null は標準出力を削除
標準出力は
echo とかで意図的に出力したもの
Warning とかエラー時に出力されるものは「エラー出力」


____ 標準出力とエラー出力をを削除
*/8 * * * * php /home/xxx/bat/xxx.bat.php 1> /dev/null 2> /dev/null
-
標準出力を削除、
エラー出力を削除。



____ 8分ごとに実行。
*/8 * * * * php /home/xxx/bat/xxx.bat.php 1> /dev/null
-
1> /dev/null は標準出力を削除
*/8することで、0, 8, 16..の間隔で実行される。


0,8,16,24,32,40,48,56 * * * * php -d max_execution_time=420 /home/xxx/bat/xxx.bat.php 1> /dev/null
指定時刻で実行。標準出力は削除。
-
php -d max_execution_time=180 /home/xxx/bat/google.bat.php
3分たったら、処理やめる。デフォルトは処理が終わるまで。


0 6 10 * * find /home/xxx/log/`date -d "$(date +\%Y-\%m-01) -1 month" +\%Y-\%m`/ | grep log$ | xargs gzip -9
毎月10日の6時に先月のログファイルを圧縮するスケジュール例。
dateコマンドの%をバックスラッシュでエスケープする必要ある。


0-5 12-14 * * * php /home/xxx/xxx.php
12時から14時の0から5分に実行される。
12:00....14:05まで


/var/spool/cron/
設定内容は以下ディレクトリに置かれている。

crontab -e
// crontab編集

crontab -l
// crontab確認



___ Thanks
標準出力・標準エラー出力、/dev/nullについて。
http://qiita.com/35_267_/items/158cd20ed26f73a3d894

http://webcache.googleusercontent.com/search?q=cache:RetsMa3gZ3MJ:miya0.dyndns.org/pc/settei/crontab.html+crontab&cd=4&hl=ja&ct=clnk&gl=jp&source=www.google.co.jp

cronなどに記述する「2> /dev/null」の「2」ってなに?
http://www.itmedia.co.jp/help/tips/linux/l0388.html

crontab スケジュールを登録。決められた時刻にプログラムを実行する。クーロン。
http://webcache.googleusercontent.com/search?q=cache:GYFokGxWeF8J:x68000.q-e-d.net/~68user/unix/pickup%3Fcrontab+crontab+dev/null&cd=1&hl=ja&ct=clnk&gl=jp

各ユーザのcrontabファイルの場所
http://yosiwo.lowtech.ne.jp/?p=860

crontab の設定で日付の入った名前のファイルをつくろうとしたらエラーでたよ
http://d.hatena.ne.jp/TamaC/20101014/1287027443

crontab日付ログファイルで出力
http://lynn1985.blog.shinobi.jp/%E5%8B%89%E5%BC%B7%E3%83%A1%E3%83%A2/crontab%20%E6%97%A5%E4%BB%98%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%87%BA%E5%8A%9B

crontab と date と %
http://maruta.be/intfloat_staff/67

crontabの記述でdateコマンドを使う場合の注意 [UN*X]
http://core-dumped.blog.so-net.ne.jp/2009-02-19-1