必要になったシチュエーション
- 複数人でユーザーを共用しているサーバー
- 他の人が別のcrontabの設定を加えるかも知れない(そして間違えて
crontab -r
を実行して削除してしまうかも知れない)
- 他の人が別のcrontabの設定を加えるかも知れない(そして間違えて
- 決まった時刻にスクリプトを実行する設定を、簡単かつ確実に登録・編集したい。
試した環境
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
実際に作ったスクリプト
下記の2つのスクリプトを同じディレクトリーに置き、install-cron.sh
を実行しよう。
ここではrun.sh
というスクリプトを毎週木曜日の朝8時に実行する設定を、crontabに登録する場合を想定して書いた。
install-cron.sh
#!/bin/bash
script_dir="$(pwd)"/"$(dirname "$0")"
# EDITOR 環境変数として edit-crontab.shを設定することで、スクリプトでcrontabを編集する
env EDITOR="$script_dir"/edit-crontab.sh crontab -e
edit-crontab.sh
#!/bin/bash
crontab_file="$1"
script_dir=$(dirname "$0")
# 実際に実行するスクリプト。もちろんここはご自由に。
run_sh="$script_dir"/run.sh
# 毎週木曜日の午前8時に実行する場合。ここの設定方法はググろう。
new_cron_entry="0 8 * * 4 $run_sh"
# NOTE: $run_sh に、正規表現のメタキャラクターが入っていると正しく動作しないので注意。
if grep --no-messages -e "$run_sh" "$crontab_file" ; then
# crontab に run.sh (実行したいスクリプトの名前)が書かれていなければ、該当する行を新しいcrontabの行で書き換える。
sed -ie "s|.*$run_sh.*|$new_cron_entry|" "$crontab_file"
echo Edited crontab entry.
else
echo "$new_cron_entry" >> "$crontab_file"
echo Added crontab entry.
fi
注意事項
- 「対象のcrontabの設定が設定済みかどうか」を、「crontabに実行したいスクリプトの名前が書かれているかどうか」で判定するため、同じスクリプトを実行する設定を2つ以上書きたい場合などはうまくいかない。
- その他、込み入ったことをしたくなったら素直にansibleのcron moduleなどを使った方がいいと思う。