在终端中使用命令行,我希望显示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
因此也需要重定向。