261

我正在尝试检查一个进程(假设它被调用some_process)是否正在服务器上运行。如果是,则回显 1,否则回显 0。

这是我正在使用的命令,但它只能部分工作(下面有更多信息)。请注意,我需要将脚本写在一行中。

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

注意: in[s]some_proces[s]为了防止grep自身返回。

如果some_process正在运行,则"1"得到回显,这很好。但是,如果some_process没有运行,则不会回显任何内容。

4

5 回答 5

360

无需明确检查$?. 做就是了:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

请注意,这依赖于 echo 不会失败,这当然不能保证。更可靠的写法是:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi
于 2013-06-19T23:52:01.920 回答
80

&&意思是“如果成功”;通过将您的if语句放在它的右侧,您可以确保它只会在grep返回时运行0。要修复它,请;改用:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(或者只是使用换行符)。

于 2013-06-19T23:44:35.117 回答
57

用于在输出grep -vc中忽略并同时计算行数。grepps

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi
于 2015-04-21T18:15:26.603 回答
16

您可以像这样充分利用&&and||运算符:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

为了排除 grep 本身,您还可以执行以下操作:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0
于 2013-06-19T23:52:36.490 回答
5
pgrep -q some_process && echo 1 || echo 0

更多单行者在这里

于 2019-09-12T02:14:56.593 回答