ファイルが使用中かどうかを確認するより速い方法はありますか?


8

ファイルが何かによって開かれている/使用されているかどうかを通知するコマンドライン関数またはc関数を探しています。

lsofそしてfuserこのことを言うが、彼らは、私は窓があり、いくつかの状況では300msの最大服用中の結果(私はMAC OS X上でこのコードを使用するときのように、私はLinuxとOS X用devvingよ)(他の情報の多くを提供します5ミリ秒かかるソリューションなので、Unixでも非常に速く、ファイルが使用中の場合にtrueまたはfalseを返す何かを見つけようとしています)


回答:


9

これをロックとして使用している場合は、どちらも機能しないlsoffuser、競合状態を防ぎます。

実行する基本的なプロセスlsof/proc/*/fs、開いているファイル記述子を探すすべてのプロセスをトロールします。何をしてもこれには時間がかかるでしょう。

これは自分で行うことができますが、システムで開いているすべてのプロセスを確認する必要があるため、これより速くなることはほとんどありません。

あなたがやっていることがタイムクリティカルである場合、それを行う別の方法を考えてください。

  • あなたが書いたプログラムを介してファイルを制御する場合; ロックファイルを使用します。
  • ファイルを操作するコマンドを実行している場合は、コマンド/プログラムが提供するドキュメントを調べて、ロックファイルを作成できないかどうかを確認してください。それが失敗した場合は、PIDを含むファイルを作成できないかどうかを確認してください。次に/proc/<PID>/fs、ファイルが現在開いているかどうかを確認できます。1つのプロセスのみを見ると、ファイル記述子を開いたほうが、それらすべてにマッピングするよりもはるかに高速になります。
  • そうでなければ、あなたを助けるために私はあなたが何をしているのかについてもっと情報が必要になります。

コメントで、Firefoxが特定のシステムで実行されているかどうかを判断するための詳細情報を提供しました。これを行う最良の方法は、Firefoxのロックファイルを探すことです。これらは、Mozilla wikiで指定されているデフォルトの場所に保存されてます。

たとえば、Linuxでは、プログラムで次のことを実行します。

  • ~/.mozilla/firefox/ディレクトリを開きます。
  • で終わるディレクトリをフィルタリングして、すべてのディレクトリをリストし.defaultます。(すべてのプロファイルは.default、すべてのディレクトリにクロールするだけでなくても、で終わると思います。)
  • 上記の各ディレクトリで、lockまたはという名前のファイルの存在を探します.parentlock。1つまたは両方のファイルが表示される場合は、Firefoxが開いています。

このアルゴリズムは、現在Windowsで実行しているものよりも高速に実行する必要があります。


すばらしい回答ありがとうございます。とにかく、それがFirefoxである場合にのみlsofとfuserにpidフォルダをチェックするように指示することはありますか?これにより、Firefoxのフォルダを除くすべてのフォルダのコンテンツがスキップされます(3つの個別のインスタンスがあるため、3つのフォルダがチェックされるだけですか?)
Noitidart

ファイルはロックされていますが、ロックされているかどうかをテストする方法がわかりません。読み取り/書き込み用に正常に開かれています。その奇妙な。私はcからfcntlを試しましたが、常に-1を返します:(
Noitidart

3
@Noitidartあなたが解決しようとしているあなたの実際の問題は何ですか?プロセスの開いているファイル記述子を検索するには、そのPIDを知っている必要があります。これは、プログラムのインスタンスごとに異なります。「手動」で取得する簡単な方法は、ps aux firefoxです。それらのPIDを取得し、/proc/ファイルシステムで調べます。
nixeagle 2014

ああ、ありがとうps aux firefox。まあ私の正確な状況は次のとおりです。私はファイルへのパスを持っています。Firefoxが実行中の場合はロックされます。ロックされているかどうか、Firefoxが実行されているかどうかを確認したいのですが。
ノイティダート2014

1
@Noitidartロックファイルを見てFirefoxを検出する方法を含めるためにコメントを編集しました。すべてのシステムでこのプロセスを繰り返すことができます。
nixeagle 2014

1

TL; DR

では、あなたのコメントの一つ、あなたが状態:

まあ私の正確な状況は次のとおりです。私はファイルへのパスを持っています。Firefoxが実行中の場合はロックされます。ロックされているかどうか、Firefoxが実行されているかどうかを確認したいのですが。

ロックファイルに関する元の質問は、Firefoxが特定のユーザーに対して実行されているかどうかを確認し、そのプロセスの状態を検査する簡単な方法がある場合の長い道のりのようです。

プロセス状態の調査

特定のプロセスのPIDを見つけるより賢明な方法は、procpsパッケージのpgrepを使用することです。例えば:

$ pgrep -u $LOGNAME firefox
5671

次に、psを使用してPIDの状態を検査できます。

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

または、他の情報を残さずに状態フラグを取得します。

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

私のシステムの1つである上記のワンライナーは、完了するまでに一貫してわずか1.4ミリ秒しかかかりません。あなたのマイレージは異なる場合があります。

プロセス状態コード

ps(1)のPROCESS STATE CODESセクションは、さまざまな状態フラグの意味を詳しく説明しています。Ubuntu 14.04では、manページには次のように書かれています。

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group

1
問題は、Firefoxが現在どのセッションにあるかを知る必要があることです。Linuxでは、単にを探します~/.mozilla/firefox/*/lock。その後、各ロックファイルの親ディレクトリ名を確認することで、セッションを識別できます。他のプラットフォームではこれは機能しません。私たちのチャットでは、Macで動作させる方法について詳しく説明しています(ubuntuには関係ありませんが、問題はありません)。公平を期すために、彼は本当に質問をより具体的に更新する必要があります。:P
nixeagle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.