シェルスクリプトでcronの時・分をランダム変換

提供:wiki - PCスキルの小技・忘却防止メモ
移動: 案内, 検索

シェルスクリプトでcronの時・分をランダム変換。cronの指定したコマンドの時・分をランダムで書き換えるシェルスクリプト

ソース

仮にファイル名を「chgCron.sh」としておく。

#!/bin/bash

# テンプファイル(TMP_IN)を用意
TMP_IN=`mktemp -q $0.XXXXXX`
if [ $? -ne 0 ]; then
	echo "$0: Can't create temp file, exiting... : TMP_IN"
	exit 1
fi

# テンプファイル(TMP_OUT)を用意
TMP_OUT=`mktemp -q $0.XXXXXX`
if [ $? -ne 0 ]; then
	echo "$0: Can't create temp file, exiting... : TMP_OUT"
	exit 1
fi

# =======================

# 引数を変数に格納
COMMAND=$*

# 時・分を設定(ランダムで時・分を設定)
HOUR=`expr $RANDOM % 3 + 10`
MIN=`expr $RANDOM % 60`

# 実行したいコマンドの時・分を書き換え
CRON="${MIN} ${HOUR} * * * ${COMMAND}"

# =======================

# 既存のcronをテンプファイル(TMP_IN)に保存
crontab -l > $TMP_IN

# テンプファイル(TMP_IN)から実行したいコマンド以外を抜出し、テンプファイル(TMP_OUT)に書き出し
grep -v --regex "^[0-9]\{1,2\} [0-9]\{1,2\} \* \* \* $COMMAND$" $TMP_IN>$TMP_OUT

# 実行したいコマンドをテンプファイル(TMP_OUT)に追加
echo "$CRON" >> $TMP_OUT

# cronの書換え
crontab $TMP_OUT

# =======================

# テンプファイル(TMP_IN、TMP_OUT)を削除
rm $TMP_IN $TMP_OUT

exit

使い方

# chgCron.sh sh /xxx/xxx/runStart.sh

これを単体で使うというよりは他のプログラム・シェルスクリプトと組み合わせて使う。

例えば下記のような構成の場合

やりたいこと
毎日一定の時間の範囲内でPHPを実行したい
考え方
「PHPを実行し、cronを書き換える」というプログラムがあれば嬉しい。
使うファイル
chgCron.sh - cronを書き換えるシェルスクリプト
runPhp.php - 実際に実行したいプログラム
runStart.sh - 「「runPhp.php」を実行後、「chgCron.sh」を実行する」というバッチファイルみたいなヤツ

「runStart.sh」のサンプル(関係のある箇所のみ抜粋した例)

php /xxx/xxx/runPhp.php
sh chgCron.sh "sh /xxx/xxx/runStart.sh"

これで日々「chgCron.sh」の中で記載されている時間の範囲内で「runStart.sh」を実行(※今回の「chgCron.sh」だと、1日複数回実行することもありえるので月日の指定など修正必要)

関連項目