作業ディレクトリを介してプロセス(または少なくともその存在)を見つける方法はありますか?

作業ディレクトリを介してプロセス(または少なくともその存在)を見つける方法はありますか?

いくつかの異なる方法でプロセスの作業ディレクトリを見つけることができることを知っていますが、その逆を実行する方法はありますか?ノードにはいくつかのサーバーアプリケーションがありますが、残念ながらこれをプロセスとして区別するのが難しく(すべて出力に表示されますnode server.js)、ps特定のサーバーが実行されているかどうかを簡単に確認する方法があることを望みました。

つまり、私が答えるべき質問は次のとおりです。ディレクトリが与えられたら、作業ディレクトリでプロセスが実行されています/x/y/zか?node server.js/x/y/z

これまでの最善の試みは、ps -ef | grep "[n]ode server.js"PIDを切り取り、ループを介してpwdx各PIDをチェックすることです。うまくいきますが、面倒でより良い方法があるかどうかを知りたいです。

答え1

pwdx は PIDS を受け入れるので、次のことができます。

$ pwdx $(ps -C "node server.js" --format pid --no-headers)
2781: /home/user
4405: /home/user/src.git/

また、.zshrcまたは.bashrcに関数を定義することもできます。

function select_by_dir()
{
  if (( $# == 0))l then
    pwdx $(ps -C "node server.js" --format pid --no-headers) 
  else
    pwdx $(ps -C "node server.js" --format pid --no-headers) | grep $1
  fi
}

}

答え2

どうですか?

pwdx `pgrep "server.js"` 

答え3

先ほど検索しました/proc

これにより、cwdを知っているすべてのpidが横にcwdと一緒にリストされます。

(cd /proc/; for p in [0-9]*; do
   cwd="$(readlink "$p/cwd")" || continue; echo "$p $cwd";
done)

grepこれを行うか、ループにマッチャーを直接挿入できます。

(cd /proc/; for p in [0-9]*; do
   cwd="$(readlink "$p/cwd")" || continue;
   [ "$cwd" != "$THE_CWD_IM_LOOKING_FOR" ] || { echo "$p"; break; }
done)

答え4

@skwllspの答えに基づいて問題を解決するために、次のbash機能を考えました。

function is-server-running {
    local path=$(realpath "${1-.}")
    pwdx $(ps -C "node server.js" --format pid --no-headers) | grep --silent "$path"
}

みんなの助けをありがとう!

関連情報