shell: set up crontab programmatically


I’ll introduce how to set up crontab programmatically with shell script.

Code

The code below is something like the code I used for crontab setup.

It is planned to be used on both web application server and mail server. Argument passed to shell should describe server environment, development or production, and server use, application or mail. And shell decide parameters written in crontab, according to the arguments.

Now, I explain what is the code doing.

Restrict User

In the code is for root crontab, so I should prevent other users from executing the script.

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

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

Function to show Help

Help message helps you, when you forget how to use. So, created the function to show the help.

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

引数の確認

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

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

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

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

ファイルと権限設定

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

set up crontab

Generate string, to be registered to crontab. echo "$cronDescription" | crontab setups the crontab.

$cronDescription をダブルクオートで囲むところが重要で、 これがないと $cronDescription 内 の * などが 展開され、 意図した crontab の設定ができません。