我正在尝试检查某个进程(假设它被称为some_process
)是否正在服务器上运行。如果是,则回显1,否则回显0。
这是我正在使用的命令,但它只能部分工作(下面有更多信息)。请注意,我需要在一行中编写脚本。
ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
注意: [s]
中的some_proces[s]
是为了防止grep
自行返回。
如果some_process
正在运行,那么"1"
会被回显,这很好。但是,如果some_process
未运行,则不会回显任何内容。
答案 0 :(得分:206)
无需明确核对$?
。只是做:
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
答案 1 :(得分:51)
&&
表示“如果成功”;通过在其右侧放置if
语句,您可以确保仅在grep
返回0
时才会运行。要解决此问题,请改为使用;
:
ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi
(或者只是使用换行符。)
答案 2 :(得分:32)
使用grep -vc
忽略grep
输出中的ps
并同时计算行数。
if [[ $(ps aux | grep process | grep -vc grep) > 0 ]] ; then echo 1; else echo 0 ; fi
答案 3 :(得分:12)
您可以充分利用&&
和||
运算符,如下所示:
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
答案 4 :(得分:1)
pgrep -q some_process && echo 1 || echo 0
更多oneliners here