2010-02-04 310 views
6

我正在检查进程是否正在运行。如果它正在运行,我想要一个返回值'OK',如果不是返回值'Not OK'。如果这是正确的术语,我只能使用没有附加任何其他参数的'ps'(例如ps -ef)。我的代码是:检查进程是否正在运行

if ps | grep file; then echo 'OK'; else echo 'NO'; fi 

这里的问题是,它并没有搜索精确的过程,总是返回“OK”,我不希望所有的信息出现我只是想知道,如果该文件是否存在。

回答

10

您的代码总是返回'OK',因为grep发现自己在进程列表中('grep文件'包含单词'file')。解决办法是做一个`grep -e [f] ile'(-e用于正则表达式),它不会找到它自己。

2
ps | grep -q '[f]ile' 
6

备用grep真正的问题:

ps -C file 

避免使用grep完全的问题。

-1

有使用grep的解决方案,以及:

if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then 
... 
elif [ ... ]; then 
... 
else 
... 
fi 

这工作正常,在Debian的6,不知道其他发行版。需要'{print $11}',因为系统也将grep视为一个过程。

1

当我知道PID我更喜欢:

[ -d /proc/<pid> ] && echo OK || echo NO 
0
if ps | grep file | grep -v grep; 
then echo 'ok'; 
else echo 'no'; 

的grep -v grep的可以确保你得到的结果是不是在执行grep的声明。

1

那么“pgrep”呢?

$ pgrep -x foo 
xxxx 
$ 

其中xxxx是名为FOO二进制运行的PID。如果foo没有运行,那么没有输出。

另外:

$如果[[pgrep -x foo]];然后回显“是”;否则回显“否”;网络连接;

如果foo正在运行,将打印“是” “否”,如果不是。

请参阅pgrep手册页。