Bash
cron

crontabを冪等に編集するスクリプト

More than 1 year has passed since last update.

必要になったシチュエーション

  • 複数人でユーザーを共用しているサーバー
    • 他の人が別のcrontabの設定を加えるかも知れない(そして間違えて crontab -r を実行して削除してしまうかも知れない)
  • 決まった時刻にスクリプトを実行する設定を、簡単かつ確実に登録・編集したい。

試した環境

$ 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などを使った方がいいと思う。