Linuxでファイルを開いているプロセスを特定するにはどうすればよいですか?


124

ロックファイルの所有権を持っているプロセスを特定したいと思います。ロックファイルは、作成された特定の名前の単なるファイルです。

だから、どのプロセスがLinuxで特定のファイルを開いているかをどのように判断できますか?ワンライナータイプまたは特定のLinuxツールソリューションが最適であることが望ましいでしょう。

回答:


55

fuserこれにも使用できます:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

これはすばらしいことでしたが、スクリプトで使用するには、出力の長さを確認する必要がありました。
チョビー

出力長はどういう意味ですか?
ネイサンフェルマン

if [ フューザ "$ file" `]; その後、exit`
chovy

1
fuserは、終了コードに関して奇妙な動作をします。A /何らかの内部エラー、チェックされたファイルが見つからないなど、B /指定されたファイルを開いたプロセスがありません。状況A /で、いくつかのエラーメッセージが出力に出力されます。残念なことに、ファイルが使用可能で、何かによって開かれた場合、出力は生成されますが、終了コードは0です。現在のような2つではなく、3つのコードでfuserが終了する方が良いでしょう。lsoftの動作は遅くなるため、lsoftの解決は少し悪くなります。
ズニック14

これは基本的にls次のパターンと同じです。エラー(無効なオプションが指定されているなど)またはファイルが見つからない場合(および情報を正常に報告する場合は0 )に終了コード2を返します。
スコット

144

ほとんどのLinuxシステムでlsof NAMEは、次のことを行います。

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

4
また、lsofがない場合はどうなりますか?
JoseLSegura 14年

3
@JoseLSegura:あなたは、「then install lsof」という答えが役に立たないほど十分に機知に富んでいると思います。問題について詳しく説明していただけますか?ルートがない場合は、別のユーザーがファイルを開いているかどうかを確認する特権がない可能性があります。
マイケルシェパー

これはファイルでは機能せず、dirsでのみ機能するようです
Jason

@Jason:ファイルに対しては機能しますが、cwd行(プロセスの現在の作業ディレクトリとしての使用を報告する)はディレクトリのみを報告します。
reinierpost

9

ファイルを開くことはロックではありません。各プロセスが最初にファイルが開いているかどうかを確認し、開いている場合は続行しないか、開いていない場合は作成/開く必要がある場合、2つのプロセスが同時に十分に確認できるためです。開いていないことを確認してから、両方を作成または開きます。

ファイルをロックとして使用するには、チェックアンドロック操作を単一の中断できない操作にする必要があります。Unixファイルシステムでこれを実現するには、読み取り専用モードでファイルを作成し、それを削除してロック解除します。ファイルが存在する(読み取り専用である)場合、ファイルの作成は失敗するため、単一のアトミック操作でチェックアンドロックを取得できます。

ロックプロセスがデーモンとして実行されるシェルスクリプトである場合、umask新しいファイルが作成されるアクセス許可を設定するプロセスごとの設定を使用して、この効果を得ることができます。

oldumask = $(umask)
umask 222#所有者にも書き込めないファイルを作成
エコー$$> / var / lock / fooの場合
それから
    :ロックに成功しました
他に
    :ロックに失敗しました
fi
umask $ oldumask
これにより、所有プロセスのPIDもファイルに書き込まれ、他の問題が解決されます。 cat /var/lock/foo
「どのプロセスがこのファイルを開いていますか?」という特定の質問に関しては、ファイルシステムをアンマウントしたいが、一部のプロセスでファイルが開いているためできない場合に役立ちます。これらのコマンドを使用できない場合は/proc、rootとして尋ねることができます。

ls -l /proc/*/cwd | grep '/var/lock/foo$'

または、致命的なユーザーとして:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


Linuxでは「ls -l」メソッドは機能しますが、CygWinでは機能していないようです。ファイルのロックに関する情報はありません。解決方法を知りませんか?ありがとう。
ソパラホデアリエレス14

いいえ、ロック用の読み取り専用ファイルを作成しません。アプリがクラッシュしても、ファイルはそこにあるためです。クラッシュしたアプリがメンタルになった後、ユーザーにがらくたを片付けさせます。
polkovnikov.ph

6

どの正確なプロセスのファイル記述子が、lsofまたはfuser- なしでファイルにリンクしているかを知りたい場合/proc

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

$1検索している開いているファイル名に置き換えます。-printf表示したいものを修正するか、そのプロセスの情報egrep -o '[0-9]+' | head -1で使用するためにパイプすることができます。ps -Fp <pid>

@finによって答えは明らかに、最良の答えですが、答えることJoseLSeguraさんのコメント@これが利用できない場合は、上記のソリューションは、私の回答でした。$ lsof <filename>


2

受け入れられた回答を使用しても、自分のディレクトリ(ubuntu 14.04)を使用しているプロセスがリストされないことがわかりました。

最後に、lsof(開いているファイルを一覧表示する)を使用し、その出力をgrepして問題のあるプロセスを見つけました。

lsof | egrep "<regexp-for-your-file>"

この使用法のよりクリーンで高速な方法lsofは、そのオプション-Rです。例: lsof -R [filename]
tron5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.