• ベストアンサー

ファイルが書き込み中かどうかの判定方法は?

Linuxで、あるファイルが現在書き込まれ中かどうかを判定する方法はないでしょうか。 思い付くのは、「sleepコマンドを介して "ls -l" を2回実行し、awkで各ファイルサイズ値を取得して比較する」という方法ですが、もっとスマートは方法はないでしょうか。 TV録画ファイルを処理する際に、録画中のファイルも処理対象としてしまわないようにするためのものです。 2007年3月10日

質問者が選んだベストアンサー

  • ベストアンサー
  • oi_goo
  • ベストアンサー率44% (20/45)
回答No.3

こんにちは. マジメ(?)に答えると,lsof とか.

RASUM2
質問者

お礼

ありがとうございます。 使えそうですね。 私の利用している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日

その他の回答 (2)

  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.2

こんばんは。 >あるファイルが現在書き込まれ中かどうかを判定する方法はないでしょうか。 watchコマンドを使ってみてはいかがでしょう? たとえば、 # watch -n 5 -d ls -l /var/log/messages -n 5 5秒間隔で、「ls -l /var/log/messages」を実行し表示する。 -d 表示の違う部分を、ハイライト表示する。 messagesファイルにログが書き込まれた場合、サイズと時刻が変化するので、 lsの表示の違う部分がハイライト表示されます。 参考にしてください。

RASUM2
質問者

お礼

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

  • saru_1234
  • ベストアンサー率33% (452/1341)
回答No.1

ソフトウェアは素人で、思いつきですが. そのファイルを書き込みオープンしてみたらいかがでしょう? 他のプロセスが書き込みオープン中(即ち書き込み中)なら 同時書き込みオープンは普通許されないでしょうから エラー応答するのでは?

RASUM2
質問者

お礼

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

RASUM2
質問者

補足

「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日

関連するQ&A