設問4:コマンドを定期的に自動実行させよう!

CodeIQに投稿した設問4の解答を説明します。

問題

cron でユーザーのディスク使用量管理

管理しているサーバーの全ユーザーのディスク使用状況を知りたいと思い、毎日定時にディスク使用量をログを取ることにしました。

UNIX のcron 機能 を使って、定期的に各ユーザーのディスク使用量の情報を取得する設定をしてください。

詳細は以下の通りです。
・/home の下にある全ユーザーのディレクトリ内の使用量をdu を使って求めてください。
・毎日23:30に情報を取得してください。
・ファイルは、/var/lib/bak に保存し、名前はdu-YYYYMMDD.log のようにしてください。
 例えば、2013年4月31日ならば、/var/lib/bak/du-20130431.log となります。
 日付の生成にはdateコマンドを使ってください。
・crontab -e で編集し、設定は crontab -e 内の一行のみで実現させてください。
 他のスクリプトファイルを読みに行くようなことはしないでください。
・使用するシェルはbashです。

【解答方法】
crontab -l の表示結果をテキストファイルに貼り付けて、そのテキストファイルをアップロードしてください。

解答

問題のプログラムのポイントは以下の3点です。

1. cronによるコマンド自動実行の理解
2. du, dateのオプションの理解
3. シェルのコマンド展開機能の理解

解答例

30 23 * * * du -s /home/* > /var/lib/bak/du-`date +"\%Y\%m\%d"`.log

dateコマンドの展開部分が難しいです。
bashスクリプト実行では、`date +"%Y%m%d"`でコマンドの展開がうまく行きますが、cronの中ではフォーマットの%\エスケープしないと正常に動作しないです。
下記のURLも参考にしてください。
http://maruta.be/intfloat_staff/67

/var/libは管理者権限があり、実際のコマンド実行には、/var/lib/bakにユーザーの書き込み権限を与える必要があります。