有没有办法通过工作目录查找进程(或至少是进程的存在)?

有没有办法通过工作目录查找进程(或至少是进程的存在)?

我知道您可以通过几种不同的方式找到进程的工作目录,但是有什么方法可以做到相反吗?我有一些在节点中编写的服务器应用程序,不幸的是很难将其区分为进程(它们都显示node server.jsps输出中),我希望有一种简单的方法来确定特定服务器是否正在运行。

换句话说,我需要回答的问题是;给定目录/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"
}

感谢大家的帮助!

相关内容