2010-01-19 16:08:15 +0000 2010-01-19 16:08:15 +0000
127
127

Linuxでどのプロセスがファイルを開いているかを判断する方法を教えてください

どのプロセスがロックファイルの所有権を持っているかを判断したいと思います。ロックファイルは単純に特定の名前のファイルが作成されたものです。

では、どのプロセスがLinuxで特定のファイルを開いているかを判断するにはどうすればいいのでしょうか?好ましくは、ワンライナー型か特定のLinuxツールのソリューションが最適でしょう。

回答 (4)

146
146
146
2010-01-19 16:18:03 +0000

ほとんどのLinuxシステムでは、lsof NAMEが仕事をしてくれます。

56
56
56
2010-01-19 17:37:11 +0000

これには 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
9
9
9
2010-01-20 13:14:12 +0000

なぜなら、各プロセスが最初にファイルが開いているかどうかをチェックして、開いている場合には進まず、開いていない場合にはファイルを作成したり開いたりする必要がある場合、2 つのプロセスが同時にチェックして、両方とも開いていないことを発見して、両方ともファイルを作成したり開いたりすることができるからです。Unixファイルシステムでは、読み取り専用モードでファイルを作成し、それを削除してロックを解除することでこれを実現できます。ファイルが存在する場合(そして読み取り専用である場合)、ファイルの作成は失敗するので、単一のアトミックな操作でチェックアンドロックを得ることができます。

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

oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask

これはまた、他の問題を解決するファイルに所有プロセスのPIDを書き込みます: cat /var/lock/foo


特定の質問に関しては、"どのプロセスがこのファイルを開いていますか?"、これはあなたの他の問題を解決します。 “これは、ファイルシステムをアンマウントしたいが、ファイルが開いているプロセスがあるためアンマウントできない場合に便利です。利用可能なコマンドを持っていない場合は、ルートとして /proc に尋ねることができます:

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

または、死すべきユーザとして:

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

2
2
2
2015-10-30 14:21:35 +0000

私は受け入れられた答えを使用して、私のディレクトリ(ubuntu 14.04)を使用していたプロセスをリストアップしていないことがわかりました。

結局、私はlsof(開いているファイルをリストアップ)を使用して、問題のあるプロセスを見つけるためにその出力をグレップしました:

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

関連する質問

6
10
5
37
3