LoginSignup
4

More than 5 years have passed since last update.

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

Posted at

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

  • 複数人でユーザーを共用しているサーバー
    • 他の人が別の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などを使った方がいいと思う。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4