crontab をコマンドで登録する方法


Rails などで、 setup を自動にしている人は多いと思います。 Rails だと whenever という gem を使って crontab をプログラムから設定してしまうことができるのですが、 メールサーバなど Rails をインストールしていない、 インストールするのも煩わしい環境だとそうはいきません。 そこで本記事では、 shell を使って crontab を設定する方法を紹介します。

コード

下は私が実際に使ったコードを一部修正したものです。

ウェブアプリケーションサーバ、メールサーバの両方で使うことを前提にしています。 シェル実行時に引数で、開発環境・本番環境の別とサーバの用途を渡します。 その情報から crontab で実行するスクリプトの引数を適切に決定して crontab を設定します。

順に説明します。

実行ユーザを制限

今回は root の crontab 設定用 スクリプト を 考えています。 そのため、 誤って別のユーザでこのスクリプトを実行されるとまずいです。

そこで、 whoami の返り値から、 実行ユーザが root でなければ終了するようにしています。

実行ユーザが root か否かを判断するには id コマンド で uid を調べたほうが ユーザ名が root でない場合でも使えるので確実ですが、 いまのところはそういった凝ったことをする予定はないので whoami の結果を 文字列 "root" と比較しています。

ヘルプを表示する関数

もし使い方を忘れたときのために、ヘルプがあると助けになります。 そこで ヘルプ表示用の関数を作ります。

スクリプトの変数に オプション -h が指定された時は getopts を利用してヘルプを表示し、 終了するようになっています。

引数の確認

引数を確認します。 引数の値によって、 crontab に記述される内容を変えます。

ディレクトリの文字列を設定

シェルスクリプトで readlink を使って絶対パスを取得しています。 絶対パスの取得・生成では pwddirname を組み合わせて使っていくこともできますが、 ... が出てくると(いびつ)な絶対パスになってしまいます、 例えば /abc/def/../hij のように。

readlink を使えば そういった .. などもきれいに消してくれます。

ファイルと権限設定

今回は Perl のスクリプトを crontab で実行するので、 実行用の Perl スクリプトをコピーして、 権限などの操作をしています。

crontab 設定

crontab にする文字列を生成し、 echo "$cronDescription" | crontab で crontab を設定します。 $cronDescription をダブルクオートで囲むところが重要で、 これがないと $cronDescription 内 の * などが 展開され、 意図した crontab の設定ができません。