状況
毎晩 cron で動く、古いログを消すスクリプト。本番に入れる前にレビューしている。
このスクリプトで最初に止めるべき点は?
#!/bin/bash# LOG_DIR は /etc/app/env で設定するsource /etc/app/envfind $LOG_DIR -type f -mtime +30 -delete正答
- env の読み込みに失敗して LOG_DIR が空だと、今いる場所以下の古いファイルを消す
- -delete は -type f より前に書かないと、ディレクトリまで消える
- -mtime +30 は 31 日以上前を意味するので、30 日ちょうどのログが残る
- source は bash 専用なので . に書き換えないと動かない
解説
find は検索開始位置を省略するとカレントディレクトリを対象にする。env ファイルが無い、変数名を打ち間違えたなどで LOG_DIR が空だと find -type f -mtime +30 -delete となり、cron の起動場所以下の 30 日より古いファイルが全部消える。source の失敗も既定では止まらない。"${LOG_DIR:?}" と書けば空のとき止まる。-delete は条件の後に置くのが正しく、この行の順序は合っている。-mtime の端数は消す範囲が 1 日ずれる程度の話。
参考: www.gnu.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ