プロが教える店舗&オフィスのセキュリティ対策術

Linuxで、あるファイルが現在書き込まれ中かどうかを判定する方法はないでしょうか。

思い付くのは、「sleepコマンドを介して "ls -l" を2回実行し、awkで各ファイルサイズ値を取得して比較する」という方法ですが、もっとスマートは方法はないでしょうか。

TV録画ファイルを処理する際に、録画中のファイルも処理対象としてしまわないようにするためのものです。

2007年3月10日

A 回答 (3件)

ソフトウェアは素人で、思いつきですが.



そのファイルを書き込みオープンしてみたらいかがでしょう?

他のプロセスが書き込みオープン中(即ち書き込み中)なら
同時書き込みオープンは普通許されないでしょうから
エラー応答するのでは?

この回答への補足

「1つのディレクトリの中の、最後の書き込みから15分程度以上経過しているファイルを処理対象にする」という趣旨で、次のようなスクリプトにすることとしました。

var0=`ls -ltc DIR/* | awk 'NR == 1 { print $8 }'`
var1=`date -r $var0 +%s | awk '{ printf("%d", $1 / 1000) }'`
var2=`date +%s | awk '{ printf("%d", $1 / 1000) }'`
if [ $var1 -eq $var2 ]; then
echo 'Equal.'
else
echo 'Not equal.'
fi

2007年3月11日

補足日時:2007/03/11 00:15
    • good
    • 0
この回答へのお礼

今、アドバイスに従って、使ったことがないrubyで、ファイルを書き込みモードで開くスクリプトを書こうとしていたのですが、ファイルのタイプスタンプを見るのが手っ取り早いのではないかと思いました。
アドバイスの方法はまだやっていませんが、とりあえずお礼まで。
また、もっと直接的な方法があれば、お教え下さい。

2007年3月10日

お礼日時:2007/03/10 22:20

こんばんは。



>あるファイルが現在書き込まれ中かどうかを判定する方法はないでしょうか。

watchコマンドを使ってみてはいかがでしょう?
たとえば、

# watch -n 5 -d ls -l /var/log/messages

-n 5
5秒間隔で、「ls -l /var/log/messages」を実行し表示する。

-d
表示の違う部分を、ハイライト表示する。

messagesファイルにログが書き込まれた場合、サイズと時刻が変化するので、
lsの表示の違う部分がハイライト表示されます。

参考にしてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
スクリプトの中に埋め込んで現在の目的に使うにはちょっと使いづらいようです。

2007年3月11日

お礼日時:2007/03/11 13:05

こんにちは.



マジメ(?)に答えると,lsof とか.
    • good
    • 0
この回答へのお礼

ありがとうございます。
使えそうですね。

私の利用しているVine4.1には入っておらず、tarからインストールするのに少し苦労したので、参考までにインストール経過を記述しておきます。

ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
から
lsof.tar.gz と Victor_A_Abell.gpg
をダウンロードする。

公開鍵を自分のkey-ringに登録する。
$ gpg --import Victor_A_Abell.gpg

登録を確認する。
$ gpg --list-keys

$ tar zxvf lsof.tar.gz
$ cd lsof_4.77
$ md5sum lsof_4.77_src.tar
MD5 (lsof_4.77_src.tar) = 42d3927386adb1e1871b97a286fa00d2

00.README.FIRST_4.77 README.lsof_4.77 を読む。

$ gpg --verify lsof_4.77_src.tar.sig lsof_4.77_src.tar
$ tar xf lsof_4.77_src.tar
$ cd lsof_4.77_src

00.README.FIRST を読む。

利用OSの'UNIX dialect abbreviations'を確認する。
$ ./Configure -h

$ ./Configure linux
$ make
$ su
# install -m 4755 -g sys lsof /usr/local/bin/lsof
# install -m 444 lsof.8 /usr/local/share/man/man8

/etc/man.config に次の設定を記述する。
MANPATH /usr/local/share/man

(利用方法)
あるディレクトリ内で、現在、ファイルを開いているプロセスを表示する。
# lsof DIR/* | awk 'NR > 1 {print $9}' | uniq

2007年3月11日

お礼日時:2007/03/11 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!