Linuxでどのプロセスがファイルを開いているかを判断する方法を教えてください
どのプロセスがロックファイルの所有権を持っているかを判断したいと思います。ロックファイルは単純に特定の名前のファイルが作成されたものです。
では、どのプロセスがLinuxで特定のファイルを開いているかを判断するにはどうすればいいのでしょうか?好ましくは、ワンライナー型か特定のLinuxツールのソリューションが最適でしょう。
どのプロセスがロックファイルの所有権を持っているかを判断したいと思います。ロックファイルは単純に特定の名前のファイルが作成されたものです。
では、どのプロセスがLinuxで特定のファイルを開いているかを判断するにはどうすればいいのでしょうか?好ましくは、ワンライナー型か特定のLinuxツールのソリューションが最適でしょう。
これには 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
なぜなら、各プロセスが最初にファイルが開いているかどうかをチェックして、開いている場合には進まず、開いていない場合にはファイルを作成したり開いたりする必要がある場合、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$'