回答:
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`
ls
次のパターンと同じです。エラー(無効なオプションが指定されているなど)またはファイルが見つからない場合(および情報を正常に報告する場合は0 )に終了コード2を返します。
ほとんどの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:~$
cwd
行(プロセスの現在の作業ディレクトリとしての使用を報告する)はディレクトリのみを報告します。
ファイルを開くことはロックではありません。各プロセスが最初にファイルが開いているかどうかを確認し、開いている場合は続行しないか、開いていない場合は作成/開く必要がある場合、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$'
どの正確なプロセスのファイル記述子が、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>