如何知道特定程序是否打开

如何知道特定程序是否打开

在终端中使用命令行,我希望显示1程序(例如 Firefox 或 Chromium)是否打开,0否则显示。

编辑:“打开”的意思是“在当前计算机上运行,​​并且在我看到的 X 服务器上打开了一个窗口”

答案1

xwininfo -root -children | grep -q '"Firefox")'
echo "$(($? == 0))"

如果有一个类窗口Firefox连接到您的 X 服务器(由任何计算机上的任何用户),将输出 1。

要限制运行该命令的计算机本地的 Firefox 进程:

xwininfo -root -children |
  awk '/"Firefox"\)/{print $1}' |
  xargs -I% xprop -id % WM_CLIENT_MACHINE |
  cut -d\" -f2 |
  grep -qFx "$(uname -n)"

按进程名称搜索并不能保证进程实际上正在显示其窗口你的X 服务器。

上述方法与firefox在未传递该选项时检查当前正在运行的firefox的方式一致--no-remote

答案2

pgrep -x chromium不会匹配诸如 , 之类的进程名称chromium-foo,并且> /dev/null可以替换为-q

pgrep -xq chromium; echo $(($? == 0))

pgrep不是由 POSIX 定义的,例如直到最近它才包含在 OS X 中。但你也可以使用ps

ps -eo comm= | grep -xq chromium; echo $(($? == 0)) # GNU
ps -eco comm= | grep -xq chromium; echo $(($? == 0)) # OS X
ps -eo comm= | sed 's|.*/||' | grep -xq chromium; echo $(($? == 0)) # either

在 OS X 中-o comm,打印命令的绝对路径并-co comm打印基本名称。在 GNU 中-o comm打印基本名称并且-c未定义。

答案3

有几种方法可以检查具有特定名称的进程当前是否正在运行。一种是使用pgrep,另一种是使用ps

pgrep "chromium" >/dev/null 2>&1 && echo 1 || echo 0
ps aux | grep "[c]hromium" >/dev/null 2>&1 && echo 1 || echo 0
grep "[c]hromium" <(ps aux) >/dev/null 2>&1 && echo 1 || echo 0

pgrep命令根据名称查找进程,并显示与其参数匹配的任何进程的 PID。这里使用 的返回值pgrep而不是其输出(因此重定向到/dev/null),以便我们知道某些内容是否匹配。该grep命令还将显示匹配项,stdout因此也需要重定向。

相关内容