我正在尝试使用以下代码检查进程是否正在运行:
SERVICE="./yowsup/yowsup-cli"
RESULT=`ps aux | grep $SERVICE`
if [ "${RESULT:-null}" = null ]; then
echo "not running"
else
echo "running"
fi
但是它一直在回显它正在运行,尽管它没有运行。我意识到 grep 本身就是结果,这就是问题所在。
如何跳过 grep 并只检查进程?
最佳答案
使用 pgrep
:
if pgrep "$SERVICE" >/dev/null 2>&1 ; then
echo "$SERVICE is running"
fi
或:
if pgrep -f "/path/to/$SERVICE" >/dev/null 2>&1 ; then
echo "$SERVICE is running"
fi
注意:
pgrep
将其参数解释为正则表达式。因此,包含正则表达式字符的路径可能无法匹配或产生误报(例如pgrep -f /home/user/projects/c++/application/executable
由于+
而无法按预期工作)。这个问题可以通过转义有问题的字符来解决(例如pgrep -f /home/user/projects/c\+\+/application/executable
)pgrep -f <pattern>
将指定模式与正在运行的进程的整个 命令行相匹配。因此,它将匹配显示为其他进程的参数的路径(例如,在一个终端中运行nano /usr/bin/sleep
,在另一个终端中运行pgrep -f /usr/bin/sleep
->pgrep
报告nano
的pid,因为它包含/usr/bin/sleep
作为其命令行中的参数)。为防止此类误报,请在模式前加上插入符号 (^
) 以强制pgrep
仅匹配命令行的开头(例如pgrep -f ^/usr/bin/sleep
)
关于linux - 检查特定路径下的程序是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29260576/