危険察知4 択難易度 応用

状況

毎晩 cron で動く、古いログを消すスクリプト。本番に入れる前にレビューしている。

このスクリプトで最初に止めるべき点は?

#!/bin/bash# LOG_DIR は /etc/app/env で設定するsource /etc/app/envfind $LOG_DIR -type f -mtime +30 -delete

正答

  1. env の読み込みに失敗して LOG_DIR が空だと、今いる場所以下の古いファイルを消す
  2. -delete は -type f より前に書かないと、ディレクトリまで消える
  3. -mtime +30 は 31 日以上前を意味するので、30 日ちょうどのログが残る
  4. source は bash 専用なので . に書き換えないと動かない

解説

find は検索開始位置を省略するとカレントディレクトリを対象にする。env ファイルが無い、変数名を打ち間違えたなどで LOG_DIR が空だと find -type f -mtime +30 -delete となり、cron の起動場所以下の 30 日より古いファイルが全部消える。source の失敗も既定では止まらない。"${LOG_DIR:?}" と書けば空のとき止まる。-delete は条件の後に置くのが正しく、この行の順序は合っている。-mtime の端数は消す範囲が 1 日ずれる程度の話。

参考: www.gnu.org

bashfindvariable

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ