サバとエンガワ

サーバーエンジニアしてます、地方に住んでます、、、

【スポンサーリンク】

隔週でコマンド実行する方法【Linux - cron】

Linuxではcron機能を使うと、あるタイミングでコマンドを実行することができます。

f:id:adakkuma:20180119202541j:plain

 

毎日10:00に実行する とか 土曜日09:00に実行するとかはだいたい分かるのですが、隔週で実行する方法について調べたのでまとめておこうと思います。

 

 

 

cron機能の基本知識

まず、cron機能の基本をすこし書きます。

毎時/毎日/毎週/毎月実行したい処理があった場合に格納するディレクトリとそれ以外のタイミングを設定するディレクトリがあります。

/etc/cron.hourly/ →毎時実行したい処理があればここ

/etc/cron.daily/ →毎日実行したい処理があればここ

/etc/cron.weekly/ →毎週実行したい処理があればここ

/etc/cron.monthly/ →毎月実行したい処理があればここ

/etc/cron.d/ →それ以外のタイミング

毎時/毎日/毎週/毎月実行したい処理があった場合のディレクトリには、実行するシェルファイルを入れればよいのですが、それ以外のタイミングで設定するディレクトリにはcronの形式に則って書く必要があります。

 

書き方は以下の通りです。 

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

 例えば、土曜日の3:15に実行(aaa.txtファイルに"Hello 環境変数USER"を追加する処理)したい場合はこんな感じ

15 3 * * 5 centos echo "Hello $USER" >> aaa.txt

centosはユーザ名です。$USER という感じで環境変数を使うこともできます。centosユーザ権限で処理は実行されます。

 

また、3分おきに実行したいという事もできます。 

*/3 * * * * centos echo "Hello $USER" >> aaa.txt

 

 

隔週で実行する方法

では、本題です。隔週で実行するためにはどのようにして書けばよいでしょうか?

cronの形式で表現できるかなと考えてみましたが、どうやら無理のようです。。。

しかし、コマンドを組み合わせることで実現することができます。

 

その方法はこちら。隔週日曜日10:00を例に挙げて書き方を示します。

0 10 * * 0 centos test $(expr $(date '+\%W') \% 2 ) -eq 0 && echo "Hello $USER" >> aaa.txt

 

では、一つずつ分解して理解していきましょう。

date '+%W'

man date を確認すると %W は 週番号で1週間は月曜日が最初 とあります。

 

expr $(date '+%W') % 2

exprは整数計算を行うコマンドで 週番号を 2 で割って 余りを求めています。

 

test $(expr $(date '+%W') % 2 ) -eq 0

 testは条件式の真偽を判定するコマンドで 0 と一致するかを確認しています。

 

上記より、週番号を2で割った余りが0と一致する場合はコマンドを実行するという事になります。

これで隔週でコマンド実行することができるというわけです。

 

ではこの辺で、また