ほとんどの Linux システムでは lsof NAME
仕事をします:
[email protected]:~$ 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
[email protected]:~$
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 つのプロセスが同時にチェックする可能性があるためです。開いていないことを確認したら、作成または開きます。
ファイルをロックとして使用するには、チェック アンド ロック操作が 1 つの中断不可能な操作である必要があります。読み取り専用モードでファイルを作成し、それを削除してロックを解除することにより、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$'