
ディレクトリで実行されているすべてのプロセスを一覧表示したいと思います。
たとえば、3つのプロセスが実行されているとします。
/home/myname/myapp/process1
/home/myname/myapp/process2
/home/myname/myapp/anotherprocess
システムに「実行中のすべてのプロセスのPIDを教えてください/home/myname/myapp
」と尋ねるにはどうすればよいですか?
私が考えることができる唯一の方法は
ps -eo pid,args | grep -i /home/myname/myapp | awk '{print $1}' | tr '\n' ' '
答え1
コマンドに注意してください。確かにディレクトリで実行されているプロセスを一覧表示します。プログラムイメージファイルを含むプロセスを一覧表示します。発見される(シェルを介して)そのディレクトリにあるので、0番目のコマンド引数にリストされています(または他のコマンド引数に記載されています)。もちろん、これらのプロセスが必ずしもそのディレクトリで実行されるわけではありません。お願いしたいと思っています(あなたが言ったことを考えるとディレクトリから実行3回)コマンドが実際に実行する操作の代わりに。
オペレーティングシステムを指定していないため:
FreeBSD/TrueOS および OpenBSD
-f
オプションを使用してfstat
ファイルシステムごとにフィルタリングし、このstat
コマンドを使用して必要なディレクトリのinode番号(${directory}
シェル変数に適切に名前があらかじめ割り当てられている)を取得し、後者をawk
次の項目の出力のwd
フィルタとして使用しますfstat
。
fstat -f "${ディレクトリ}" | ああ '{ if ($4 == "wd" && $6 == '"`stat -f %i \"${directory}\"`"' && !x[$3]++) $ 3を印刷してください。 } '他のユーザーのプロセスを含めるには、スーパーユーザー(専用)
fstat
で実行してください。
Linux
2つの方法:
- その
-d
オプションを使用してエントリlsof
のみを選択しcwd
、そのコマンドとstat
いくつかのdc
後処理を使用して、目的のディレクトリのinode番号とマウントされたデバイスのメイン/マイナー番号(シェル変数に適切に事前に名前が付けられています)を取得し、${directory}
後者awk
の2つ犬を出力フィルタとして使用してくださいlsof
。lsof -d cwd | ああ '{ if ($8 == '"`stat --format %i \"${ディレクトリ}\"`"'\ && $6 == "'" `dc -e \"16doi \`stat --format %D \"${ディレクトリ}\"\` 100~ rn[,]Pn\"`"'" \ && !x[$2]++) $ 2を印刷してください。 } '
他のユーザーのプロセスを含めるには、スーパーユーザー(専用)lsof
で実行してください。 fuser
他の答えと同じように使用されます。
答え2
使用fuser -m /path/to/folder 2>/dev/null
(stderr
出力から削除)または使用可能なユースケースの確認man fuser