FreeBSD/TrueOS および OpenBSD

FreeBSD/TrueOS および OpenBSD

ディレクトリで実行されているすべてのプロセスを一覧表示したいと思います。

たとえば、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他の答えと同じように使用されます。

おすすめ記事