我想在bash脚本中编写一段代码来检查程序是否已经在运行。为了搜索bar是否正在运行,我有以下内容
foo=`ps -ef | grep bar | grep -v grep`
这个
grep -v grep
部分是为了确保ps结果中不考虑"grep bar“
当bar没有运行时,foo正确地为空。但我的问题在于这个脚本
set -e
这是一个标志,用于在某个命令返回错误时终止脚本。结果是,当bar没有运行时,"grep -v grep“不匹配任何内容,grep返回一个错误。我尝试使用-q或-s,但都无济于事。
有什么解决方案吗?Thx
发布于 2011-07-02 00:17:49
当然:
ps -ef | grep bar | { grep -v grep || true; }
或者甚至是:
ps -ef | grep bar | grep -v grep | cat
发布于 2011-07-02 01:08:14
如果你只打算丢弃99%的输出,为什么要让ps
用-ef
提供大量的输出呢?ps
,尤其是GNU版本,是一把方便功能的瑞士军刀。试试这个:
ps -C bar -o pid= 1>/dev/null
我在这里指定-o pid=
只是因为,但实际上它是没有意义的,因为我们无论如何都会丢弃所有的stdout。但是,如果您想知道实际运行的PID,它将非常有用。
如果-C
无法匹配任何内容,则ps
将自动返回非零的exist状态,如果匹配,则返回零。所以你可以简单地说
ps -C bar 1>/dev/null && echo bar running || echo bar not running
或
if ps -C bar 1>/dev/null ; then
echo bar running
else
echo bar not running
fi
这不是更简单吗?不需要grep,不需要两次甚至一次。
发布于 2011-07-02 00:19:17
foo=`ps -ef | grep bar | grep -v grep` || true
https://stackoverflow.com/questions/6550484
复制相似问题