Vimとボクと、ときどき、PHP

Vim好きなエンジニア(主にPHP開発)が不定期に技術情報やネタを書いていくブログです

Home » でっかくなっちゃった!

でっかくなっちゃった!

社内システムのとあるバッチが妙な結果を出していたので、調査したお話です。

概要

バッチの処理内容は下記の通り。(概要です)

  • 1日1回、深夜(というか早朝というか)にCron実行される
  • FreeBSDのレンタルサーバで動作
  • 特定のディレクトリ内にある、古くなって不要になったファイルを検出して削除する
  • 処理完了後に、そのディレクトリ内のファイルサイズの合計などをメールで送信する
  • PHPで実装されていて、ファイルサイズの合計は shell_exec('du -s ' . $path); で取得している

どんな結果になっていたか

メールに記載されている、処理後の合計ファイルサイズがやけに大きいなと思っていました。どう考えても実際のサイズと合っていない気がしたのです。
そこで、SSHでログインして下記のコマンドを叩いてみたところ、やはりサイズが違いました。

しかも、メールには本来の2倍のサイズが記載されていたのです。

何が悪かったのか

manコマンドでduのマニュアルを見てみたところ、下記の内容に目が止まりました。

 -B blocksize
         Calculate block counts in blocksize byte blocks.  This is differ-
         ent from the -h, -k and -m options or setting BLOCKSIZE and gives
         an estimate of how much space the examined file hierarchy would
         require on a filesystem with the given blocksize.  Unless in -A
         mode, blocksize is rounded up to the next multiple of 512.

 -k      Display block counts in 1024-byte (1-Kbyte) blocks.

ほぼ解決ですね。環境変数BLOCKSIZEが設定されているかどうかが原因と思われます。
また、-kオプションを付けて実行すれば、BLOCKSIZEの値によらずにKB単位で出力してくれそうです。

簡単に確認

SSHでログインして手動でコマンドを叩く場合と、PHPのshell_execduコマンドを実行する場合とで、どのような違いがあるかを調べてみました。
まず手動でコマンド実行の場合です。

思った通り、環境変数BLOCKSIZEが設定されていました。

続いてPHPの場合です。下記の内容でファイルを作り、ブラウザでURLを叩いて実行しました。(手動でphpコマンドで実行すると環境変数が影響するため)

出力はこんな感じになりました。

BLOCKSIZE=
946992  /path/to/target/dir

やはり、BLOCKSIZEは設定されていないことが分かりました。そのせいで、ブロックサイズが512Byteで計算され、結果の数字が倍になっていたんですね。

解決

サイズはKB単位で得られればいいので、duのオプションに-kを追加しましょう。

結果は下記の通り。

BLOCKSIZE=
473496  /path/to/target/dir

良いようですね。そして、最初に「FreeBSDのレンタルサーバ」とか書いてますが、FreeBSDは関係なかったですねw

Name of author

Name: よーすけ

Short Bio: 主にPHP開発をやってる社内PGです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です