我知道您可以通过几种不同的方式找到进程的工作目录,但是有什么方法可以做到相反吗?我有一些在节点中编写的服务器应用程序,不幸的是很难将其区分为进程(它们都显示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"
}
感谢大家的帮助!