カテゴリー
[Shellコマンド] Cronによる営業日(土日・祝日以外)のみで定期コマンド実行をスケジュールしたい
※ 当ページには【広告/PR】を含む場合があります。
2020/10/01
2022/01/22
動作確認時の手元の環境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
Cronコマンドの使用前準備 〜 grepでパターンを判定するテクニック
$ echo 'hoge piyo fuga' | grep 'piyo'
hoge piyo fuga
$ cat << EOF > tmp.txt
hoge
piyo
fuga
EOF
$ cat tmp.txt | grep 'piyo'
piyo
tmp.sh
#!/bin/bash
if echo "$1" | grep 'piyo' > /dev/null; then
echo 'piyo was found.'
else
echo 'piyo was not found.'
fi
piyo
#tmp.shの実行権限を与える
$ chmod +x tmp.sh
#文字列にpiyoを含むと...
$ ./tmp.sh 'hoge hoge piyo fuga'
piyo was found.
#文字列にpiyoを含まないと...
$ ./tmp.sh 'hoge hoge fuga fuga'
piyo was not found.
> /dev/null
tmp.sh
#!/bin/bash
if grep 'piyo' "$1" > /dev/null; then
echo 'piyo was found.'
else
echo 'piyo was not found.'
fi
tmp.txt
$ cat tmp.txt
hoge
piyo
fuga
$./tmp.sh tmp.txt
piyo was found.
Cronとgrepを組み合わせて営業日だけ実行できるスケジュールを作る
昭和30年(1955年)から令和3年(2021年)国民の祝日(csv形式:19KB)
$ wget -O tmp.csv https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
$ cat tmp.csv | iconv -f SJIS
国民の祝日・休日月日,国民の祝日・休日名称
1955/1/1,元日
1955/1/15,成人の日
1955/3/21,春分の日
1955/4/29,天皇誕生日
1955/5/3,憲法記念日
#....中略
2021/10/11,スポーツの日
2021/11/3,文化の日
2021/11/23,勤労感謝の日
holidays.csv
$ wget -q -O - https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv | \
iconv -f SJIS | grep -e "^202" > holidays.csv
$ cat holidays.csv
2020/1/1,元日
2020/1/13,成人の日
#...中略
2021/11/3,文化の日
2021/11/23,勤労感謝の日
grepの判定と後続のコマンドを組み合わせる
&&
||
holidays.csv
'2021/5/5'
'2021/5/5'
#2021/5/5,こどもの日
$ grep '2021/5/5' holidays.csv > /dev/null && echo 'こどもの日!'
こどもの日!
#何も起きない....
$ grep '2021/5/8' holidays.csv > /dev/null && echo 'こどもの日!'
&&
#2021/5/5,こどもの日
#何も起きない
$ grep '2021/5/5' holidays.csv > /dev/null || echo 'こどもの日じゃない!'
#こどもの日ではない
$ grep '2021/5/8' holidays.csv > /dev/null || echo 'こどもの日じゃない!'
こどもの日じゃない!
寄り道〜会社の創立記念日をスケジュールに追加
$ echo '2021/8/4,会社の創立記念日' >> holidays.csv
Cronと組み合わせる
営業日(土日・祝日以外)
0 9 * * 1 grep `date "+\%Y/\%-m/\%-d"` holidays.csv > /dev/null || echo 'おはようございます。今週も張りきっていきましょう'
0 12 * * 1-5 grep `date "+\%Y/\%-m/\%-d"` holidays.csv > /dev/null || echo 'お昼休みです'
0 18 * * 1-5 grep `date "+\%Y/\%-m/\%-d"` holidays.csv > /dev/null || echo '残業は厳禁です!'
0 17 * * 5 grep `date "+\%Y/\%-m/\%-d"` holidays.csv > /dev/null || echo '今週もお疲れさまでした'
date "+\%Y/\%-m/\%-d"
Cronスクリプトの'%'文字には注意
%
0 9 * * 1 grep `date "+%Y/%-m/%-d"` holidays.csv > /dev/null || echo 'おはようございます。今週も張りきっていきましょう'
0 12 * * 1-5 grep `date "+%Y/%-m/%-d"` holidays.csv > /dev/null || echo 'お昼休みです'
0 18 * * 1-5 grep `date "+%Y/%-m/%-d"` holidays.csv > /dev/null || echo '残業は厳禁です!'
0 17 * * 5 grep `date "+%Y/%-m/%-d"` holidays.csv > /dev/null || echo '今週もお疲れさまでした'
%
%
\
%
\%
Cronで使うための環境変数の設定方法
#...省略
* * * 2 1-5 grep `date "+\%Y/\%-m/\%-d"` /home/hoge/piyo/fuga/moga/my-favorite-desk.csv > /dev/null || bash /home/hogehoge/piyo/fugafuga/2022-02/seller.sh >> /home/hoge/piyo/fuga/moga/2022-03/sales.csv
#...省略
.bashrc
#...省略
#👇Cronスクリプト内部で環境変数として利用できる
INPUT=/home/hoge/piyo/fuga/moga/my-favorite-desk.csv
MY_SCRIPT=/home/hogehoge/piyo/fugafuga/2022-02/seller.sh
OUTPUT=/home/hoge/piyo/fuga/moga/2022-03/sales.csv
* * * 2 1-5 grep `date "+\%Y/\%-m/\%-d"` $INPUT > /dev/null || bash $MY_SCRIPT >> $OUTPUT
#...省略
まとめ
holidays.csv
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー