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

这是我正在使用的命令,但它只起部分作用(更多信息如下)。注意,我需要在一行中编写脚本。

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

注意:some_processes [s]中的[s]是为了防止grep返回自身。

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


&&表示“如果成功”;通过将if语句放在它的右边,可以确保它只在grep返回0时运行。要解决它,使用;而不是:

Ps aux | grep some_processes [s] > /tmp/test.txt;如果[$?-eq 0];然后echo 1;返回0;fi

(或者直接使用换行符)。


不需要显式检查$?。只做:

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

你可以像这样充分利用&&和||操作符:

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

使用grep -vc忽略ps输出中的grep并同时计算行数。

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

pgrep -q some_process && echo 1 || echo 0

这里有更多的单行线