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

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

このような:

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

test1.outファイルのPID番号とそのファイルが配置されているディレクトリを一覧表示するためにfindコマンドを使用する方法は?

よろしくお願いします。

答え1

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

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

答え2

試すことができる2つの回避策は次のとおりです。

fuser /path/to/opened/file

または

lsof /path/to/opened/file

答え3

問題をどのように解釈するか(コメントを参照)、解決策は次のとおりです。

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

または:

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

$root_dir検索を実行する開始ディレクトリと$file_name検索するファイル名で変数を定義できます。

最初のオプションは実行中の実行可能ファイルを検索するのに適しており、2番目のオプションは実行可能ファイルとしてデータファイルを実行するのに適しています。

これをテストするために(最初の選択肢の場合)、コマンドを使用してファイルを開き、それを停止してバックグラウンドに入れてから実行しましたless。 2番目のオプションをテストするためにデータファイルを作成しました。最初に実行してから実行し、最後に 。C-zfind /usr/bin -name less -exec pidof {} \;~/test.txtless ~/test.txtC-zfind ~ -name test.txt -exec fuser {} \;

関連情報