web-dev-qa-db-ja.com

findコマンドを使用してファイルのPIDとその場所を取得する方法は?

このようなもの:

PID = 3187:/home/morganc/test1.out

Findコマンドを使用して、test1.outファイルのPID番号とそれが配置されているディレクトリを一覧表示するにはどうすればよいですか?

前もって感謝します。

2
Thomas

あなたは2つの解決策を試すことができます:

fuser /path/to/opened/file

または

lsof /path/to/opened/file
1
Gilles Quenot

あなたが作成したプロセスの所有者であるか、ファイルを開いている場合は、次のことができます

ls -o /proc/*/fd 2> /dev/null

ユーザーIDのPIDのすべてのファイルをリストします。多くのプロセスが実行されていない場合は、出力を手動で確認してください。サンプル:vmstat.outが開いているプロセスを探す:

mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null
/proc/27669/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark
l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null
lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history

/proc/27737/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/Oracle/log/vmstat.out
lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify

したがって、PID 27737はファイルvmstat.outを開いており、フルパスは/home/Oracle/log/vmstat.outです。

ほとんどの出力を除外する場合は、次のことを試してください。

mark (/home/Oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E '(^/proc|vmstat.out)'
/proc/27669/fd:
/proc/27943/fd:
lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/Oracle/log/vmstat.out
/proc/28047/fd:
/proc/28048/fd:
/proc/self/fd:
mark (/home/Oracle/log)>

次に、対象のファイルの真上にあるPIDを探します。

他のプロセスを無視するために、パイプラインでawkを実行し、前の行を保存し、現在の行がlで始まるのを見つけたときに前の行を出力しました。

ls -l /proc/*/fd 2> /dev/null | \
  grep -E '(^/proc|vmstat.out)'  | \
  awk 'BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev  $NF }'

/proc/27943/fd:/home/Oracle/log/vmstat.out
1
Mark Stewart

私があなたの質問をどのように解釈するかに応じて(コメントを参照)、あなたの解決策は次のいずれかになります:

find $root_dir -name $file_name -exec pidof {} \;

または:

find $root_dir -name $file_name -exec fuser {} \;

変数$root_dirを、検索を実行する開始ディレクトリとして定義します。$file_nameは、検索するファイルの名前として定義します。

実行可能ファイルを検索する場合の最初の代替案は実行され、2番目の代替案は実行可能ファイルによって実行されるデータファイルの場合です。

これをテストするために(最初の選択肢の場合)、lessコマンドを使用してファイルを開き、C-zを押して停止し、バックグラウンドに置いて、find /usr/bin -name less -exec pidof {} \;を実行しました。 2番目の代替案をテストするために、データファイル~/test.txtを作成し、less ~/test.txt、次にC-z、次にfind ~ -name test.txt -exec fuser {} \;を実行しました。

1
user1404316