[tmpwatch] .recycleディレクトリ配下を定期的に削除するの巻

スポンサーリンク

今回、sambaにて設定しているゴミ箱フォルダ「.recycle」ディレクトリ配下のファイルがたまりに溜まってしまっていたという問題が発生。それがディスク容量を圧迫していました。なので、定期的にファイルを削除する簡単な方法がないかと探してみました。そしたら、tmpwatchをちょちょっと変更したら利用できそうなので記事にしてみます。

まず、tmpwatchって何って話。

man tmpwatchから引用すると

tmpwatch – removes files which haven’t been accessed for a period of time
(trippyboy訳:特定の期間アクセスされていないファイルを削除するやーつ)

となっています。

tmpwatchのインストールはyumで簡単にできます。

# yum -y install tmpwatch

yumでインストールされたファイルを確認してみます。

# rpm -ql tmpwatch
/etc/cron.daily/tmpwatch
/usr/bin/tmpwatch
/usr/sbin/tmpwatch
/usr/share/doc/tmpwatch-2.9.16
/usr/share/doc/tmpwatch-2.9.16/COPYING
/usr/share/doc/tmpwatch-2.9.16/ChangeLog
/usr/share/doc/tmpwatch-2.9.16/NEWS
/usr/share/doc/tmpwatch-2.9.16/README
/usr/share/man/man8/tmpwatch.8.gz
#

設定ファイルだけを見たいので「-qc」で見てみます。

# rpm -qc tmpwatch
/etc/cron.daily/tmpwatch
#

上記を見ると「/etc/cron.daily」配下に「tmpwatch」というファイルが作成されたことがわかります。
このファイルにて、特定の期間アクセスされていないファイルやディレクトリを削除する処理が行われています。

デフォルトの記述は以下のとおり

#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

これを読み解く必要がありますね。シェルがわかる人は読めると思うのですが、tmpwatchに渡されているオプションの意味をまず確認しておきましょう。わかりやすいように赤字にしておきました。

  • -u: ファイルへの最終アクセス日時
  • -m: ファイルの変更(ファイルのコンテンツ変更)日時
  • -c: ファイルのinode変更(パーミッションや権限変更)日時
  • -umc: ファイルへの最終アクセス・コンテンツ・パーミッションや権限変更日時
  • -x: 指定されたディレクトリもしくはシンボリックリンク以外のファイルを対象外とする
  • -X: -xと同じ。でも指定するパスをパターンで指定できる
  • -f: 書き込み権限がなくても削除する
  • 10d: 10日以上アクセスがないもの。dの代わりにm(min),h(hour)も指定できる。指定がない場合はhとして認識される。

まずは-u(–atime)、-m(–mtime)、-c(–ctime)がファイルやディレクトリのどの時間を対象としているのか、認識を深めるための検証をしてみました。

# touch hogehoge ←ファイルの作成
#
# stat hogehoge ←statコマンドで確認
  File: `hogehoge'
  Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
Device: fd00h/64768d    Inode: 145725      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-12-25 15:51:49.797996327 +0900
Modify: 2013-12-25 15:51:49.797996327 +0900 全部一緒
Change: 2013-12-25 15:51:49.797996327 +0900
#
# echo foo >> hogehoge ←ファイルへの追記
#
# stat hogehoge
  File: `hogehoge'
  Size: 4               Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 145725      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-12-25 15:51:49.797996327 +0900
Modify: 2013-12-25 15:52:25.228997984 +0900 mtimeが変更される
Change: 2013-12-25 15:52:25.228997984 +0900 ctimeが変更される
#
# cat hogehoge ←ファイルを閲覧(アクセス)する
foo
#
# stat hogehoge
  File: `hogehoge'
  Size: 4               Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 145725      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-12-25 15:52:48.413999424 +0900 atimeが変更される
Modify: 2013-12-25 15:52:25.228997984 +0900
Change: 2013-12-25 15:52:25.228997984 +0900
#
# chmod 777 hogehoge ←パーミッションを変更する
#
# stat hogehoge
  File: `hogehoge'
  Size: 4               Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 145725      Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-12-25 15:52:48.413999424 +0900
Modify: 2013-12-25 15:52:25.228997984 +0900
Change: 2013-12-25 15:52:58.235000217 +0900 ctimeが変更される
#

ここでもう一度スクリプトに戻ってみましょう。

#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

上記の①から説明します。以下の記述は「\」で複数行に区切られているコマンドを1行にまとめています。

/usr/sbin/tmpwatch -umc -x /tmp/.X11-unix -x /tmp/.XIM-unix -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix -X '/tmp/hsperfdata_*' 10d /tmp

/tmp/配下を対象として-umc(意味は上述を参照)が対象としている時間がから10日以上の期間が経過しているものを対象として削除します。-xや-Xを用いて対象外とするファイルやフォルダを指定しています。

-umcがしてされている場合、どの時間が基準となるかは、マニュアル(man tmpwatch)に以下の記述があります。

If the –atime, –ctime or –mtime options are used in combination, the decision about deleting a file will be based on the maximum of these times.
(trippyboy訳:もし「-u」、「-m」もしくは「-c」があわせて利用された場合、期間の判断は一番新しい日時を元に行われます。

つまり-umcのすべてが10日以上前のものでないと削除がされないということ。

次に上記の②

for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

上記はfor文を用いて「$d」を対象に、「$d」に収められているディレクトリ(後述)が、-umcが対象としている時間から30日以上の機関が経過しているものを強制的に削除しています。

「$d」には以下のフォルダが入ります。上記のfor文から読み解くには、「{」「}」で囲われた「,」カンマ区切りのものがどのように処理されるかと、「?」がどう言う意味かが分かる必要があります。

/var/cache/man/cat      +何か一文字
/var/cache/man/X11R6/cat +何か一文字
/var/cache/man/local/cat  +何か一文字
/var/catman/cat         +何か一文字
/var/catman/X11R6/cat   +何か一文字
/var/catman/local/cat    +何か一文字

さて、長くなってしまいましたが、本来の目的はsambaで利用する.recycleディレクトリ配下を削除するというのが目的です。

.recycleの保存場所が「/home/hoge/samba/.recycle」とした場合、7日間以前のファイルを削除するには、以下の記述を該当ファイルに追加します。

/usr/sbin/tmpwatch "$flags" -f 7d /home/hoge/samba/.recycle

長くなってしまいました(^_^;)

コメント

  1. くりくり より:

    東京で仕事していた時はディスクの使用率を毎日execelで記録してお客さんに報告していましたが、
    今の会社は使用率1パーセントか2パーセントなんでまったく気にしなくなりました。
    それとSambaってローカル環境で使うと思うのですが、
    なぜかplesk11にsambaがついてました。とめましたけど(w

  2. trippyboy より:

    くりくりさん

    毎日ですか・・・ それは面倒くさかったでしょうに。
    Excelつながりで、Linux場でPHPExcelというモジュール(?)を用いてExcelファイルが作れるようです。
    最近気になっていますけど、こういうお客さんの要望にはガッツリ自動化してメール送信したるわーってのも
    対応手段としてはいいかもしれませんね(・∀・)

    使用率1,2%って、ほぼ使っていないに等しいじゃないですかww

    Sambaはインターネット経由でも利用出来ます。
    基本的にローカルで利用するものとは思っていますが、ハードディスクの故障などの問題対象を行うのが
    面倒になるからレンタルでいいやぁーという手もあると思います。でも、日本の企業は社外のストレージに
    データを保存するのにアレルギーを持っている企業が多いのではないかと感じます。
    いっそ、Googleドライブでいいじゃん。。って別の話ですか(笑)

  3. くりくり より:

    うちはハードディスクの故障はレンタルサーバーまかせです。
    壊れたことはありませんけどね。

    さて、いつも情報を頂いてばかりで申し訳ありませんので、rhel 7の情報を
    ご存知のようにinitがなくなり、systemdになりました。
    rhel7はレスキューターゲットとエマージェンシーターゲットを使います。
    レスキューターゲットはinit1に相当しエマージェンシーターゲットはルートファイルシステムがマウントできない場合に
    使うらしいです。モードの移行の仕方はカーネルの選択画面でeをうちこむとgrub.cfg(grub2)の編集画面に行こうします。
    linux16 /vmlinuz-3.10.0-54.0.1.el7.x86_64 systemd.unit=emergency.targetとうちこみF10をおすとエマージェンシーモードで起動します。レスキューモードはsystemd.unit=rescue.targetです。
    grubの編集画面で=の出し方はshift+”ほ”ではなくとなりの”へ”を使います。

  4. trippyboy より:

    やっぱりそうなりますよね。ハードディスクの故障対応は嫌です(笑)
    せめてRAID構成にしておいて、壊れたらハード屋に直してもらうようなのであれば
    耐えられるかとは思いますが、壊れない(仮想ディスク環境で監視されている)環境の
    レンタルサーバーの方がいいと考えています。

    rhel7… なんだか全然替ちゃって、今まで参考にしていたような優良サイトの
    情報が少しずつあてにならなくなるんじゃないかと思うと悲しいです。
    grub画面での「=」の出し方、キットいつか役に立ちそうです。
    たまに、いっそのことUS101配列も覚えてしまおうと思ったりします(^^;

    php5.5にしてみました!

タイトルとURLをコピーしました