• ベストアンサー

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

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

  • シェルでファイルが2Gを超えているかの判定は?

    posix shでファイルが2Gを超えているかの判定を行いたいです。 size=`ls -l FILE | awk '{printf $5}'` if [ $size > 2147483648 ] then echo "2G超え" fi で、出来るかと思いましたがシェルではこのif文が行えません。 全然違う方法でいいのですが なんとかファイルサイズが2G超えか判定する方法は ありますでしょうか?

  • ファイルサイズが取得できないケースを判定方法

    シェルスクリプトで指定ファイルのファイルサイズを取得する際 何らかの原因でファイルサイズが出来なかった場合に、エラーとしたいです。 以下の方法で、サイズ取得できますが、 エラー時の判定できません。 SIZE=`ls -l $FILENAME|awk '{printf("%s",$5)}'` (`~`は、文字列となる為??、`~|grep~`は?) 通常エラーの場合、$?にゼロ以外が代入されるのだと、思いますが・・・・ エラーの特定方法が分かる方、ご教授ください

  • ファイル転送が完了したことを判定する

    UNIX上のシェルにて、大容量のファイル転送が完了したかどうか判定する方法はないでしょうか?test -r $対象ファイル をすると転送中でも読み取り可能となってしまい、ファイルが転送完了したか判断できません。wcコマンドやcatコマンドを使用すると一応エラーではかえってくるのですがそんな方法しかないのかな?と疑問を感じています・・・。

  • AIX6でファイルのタイムスタンプの秒を表示するコ

    linuxでは以下のコマンドで確認できました。 ls --full-time または ls -l --time-style=”+%Y/%m/%d %H:%M:%S” AIX6で同様のコマンドを実行してもエラーになります。 ls以外でもかまわないので、 ファイルのタイムスタンプを秒まで表示する方法がありましたら、 教えてください。

  • ファイル数の取得

    ディレクトリにあるファイル数を出力するUNIXのコマンドを探しています lsやls -lですとファイルの詳細までは見れますが、ファイル数は出てきません。 その他調べてみたのですが、方法が見つかりませんでした。 最悪はlsの結果をファイルに書き出してそのファイルの行数を見れば出来そうですが あまりにつたないやり方なので…。 ご存知であればよろしくお願いします。 正式にはBSDではなくBSDをベースにしたマシンですので もしかしたらBSDのコマンドが動かない or BSD以外のコマンドでも動くなどあるかもしれませんが どれかのUNIXで使えれば試してみますので 何かコマンドをご存知であれば教えていただければと思います。 よろしくお願いします。

  • PHPでテキストファイルかどうかを判定する方法

    基本的なことですが、PHPでテキストファイルかバイナリーファイかを判定する方法がわかりません。以下のperlコードをphpで書く方法を教えてください。 if( -T $filename ){ テキストファイルの処理 }else{ バイナリーファイルの処理 } マニュアル見ましたがよくわかりませんでした。よろしくお願いします。

    • 締切済み
    • PHP
  • テキストファイルの行抽出

    linux環境のプログラムについて質問です。 ある特定のファイル(テキストファイル)内のデータで 指定の行を抽出する方法を教えていただきたいと思います。 現在はawkを使用してbashスクリプト内で下記のように head, tailを使用していますが、処理が重いように 感じます。perlまたはawkなどで行抽出の軽い処理は できないでしょうか? (他のunixコマンドでも結構です。) ---------------------------------------- RNUM=`awk 'END{print NR}' $1` #行番号取得 for iwl in `seq 1 $RNUM`;do BASE=`head -n $iwl $1 | tail -n 1` done #iwl ---------------------------------------- Fortran, Cなども使えますが、色々組み合わせて使う上で bash内のスクリプトで行ないたいと思います。

  • lsでのファイル名・パスのフルパス取得

    環境:Solaris10 lsコマンドでディレクトリ、ファイル名の一覧を取得しようとしています。 条件としては 1.対象は全てのディレクトリ・ファイル(ls -R) 2.実行結果はアクセス権・所有者の情報も含む(ls -lの結果のような) 3.ディレクトリ・ファイル名ともにフルパスで表示 この上記3点を満たそうとして、 ls -dlR / と実行してみましたが、この場合Rスイッチが有効になりませんでした。 OS標準コマンドでこの3点を満たすことは出来るのでしょうか?

  • LinuxとMacのコマンドのオプションの違い

    LinuxとMacのターミナルコマンドのオプションの違いについて質問があります。 例えば、lsコマンドを用いる場合、Linuxでは 「ls -l /」と「ls / -l 」は同じ動作をしますが、Macでは、後者(オプションを後ろにつける)と動作しません。 同様にrmコマンドの-rなども後ろにつけると動作しません。 この違いは何の違いから生じるものなのでしょうか? ターミナル?コマンド?shell?OS? また、macで動作させる方法はあるのでしょうか? よろしくお願いいたします。 LinuxはUbuntu16.04、MacはMojaveです。 シェルは共にbashです。

  • Linuxコマンドの『du』について

    宜しくお願いします。 アップロードした画像ファイルの容量を調べたく、サーバにroot権限でログインし、Linuxコマンドの 『du -b imgfile』 で調べたのですが、FFFTPで見た容量と、Linuxコマンドの 『ls -l imgfile』 で調べた容量と誤差が出ます。具体的には、duコマンドで調べた容量が 24576Byte なのに対し、同じファイルをFFFTPで見たのと、lsコマンドで調べた場合は、 22019Byte という具合に、誤差が出ます。 容量の大きなファイル程、その差も大きくなります。 この問題を解決する方法をご存知でしたら、是非ご教授下さい。 宜しくお願い致します。