次のようなもの:

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

findコマンドを使用して、test1.outファイルのPID番号と場所のディレクトリを一覧表示するにはどうすればよいですか。見つかりましたか?

よろしくお願いします。

コメント

  • 混乱していないかどうかfindコマンドとps
  • ファイルを作成したプロセスまたは開いているプロセスがまだ実行中の場合、Gillesの回答は機能します。ファイルを作成したプロセスは実行されなくなり、過去に何が起こったかを知る方法がありません。
  • ファイルはどのようにしてPIDを取得しましたか?

回答

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

fuser /path/to/opened/file 

または

lsof /path/to/opened/file 

回答

ファイルを作成したプロセスの所有者であるか、ファイルを開いている場合は、君は

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が開いており、フルパスは

出力の大部分を除外する場合は、次のことを試してください。

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にパイプして前の行を保存し、現在の行が

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 

回答

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

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

または:

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

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

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

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

コメント

  • 20人が実行している場合

? OPは出力ファイル名を検索することを望んでいると思います。

  • 質問はデータファイルではなく実行可能ファイルの使用を検索することであると理解したので、あなたの場合、彼は20個のpidを取得します。単一のパス。ただし、質問の解釈がどのように異なっているかはわかります。そのため、' 2つ目の解決策を回答に追加して、ケースをカバーします。ありがとうございます。