2016-12-07 85 views
1

与跟随着的代码检查如果一个进程正在运行,如果没有,使用cron

#!/bin/bash 
ps -aux | grep sidekiq > /dev/null 
if [ $? -eq 0 ]; then 
    echo "Process is running." 
else 
    echo "Process is not running." 
fi 

要检查是否sidekiq进程正在运行或不,我创建restart.sh重新启动它。我会把这个脚本放在cron中,每天运行,所以如果sidekiq没有运行,它会自动启动。

我的问题是,与

ps -aux | grep sidekiq 

即使进程没有运行,它显示

myname 27906 0.0 0.0 10432 668 pts/0 S+ 22:48 0:00 grep --color=auto sidekiq 

,而不是什么都没有。即使进程没有运行,它也会以grep计数,因此它显示为“sidekiq”进程正在运行。如何不计算这个结果?我相信我必须使用awk,但我不确定如何在此处使用它以获得更好的过滤效果。

回答

3

ps输出中排除grep结果。不要

ps -aux | grep -v grep | grep sidekiq 

(或)做一个regEx搜索的进程名,即s随后进程名的其余部分。

ps -aux | grep [s]idekiq 

为了避免这样的冲突在搜索使用过程greppgrep直接与进程名

pgrep sidekiq 

使用pgrep会像下面的一个有效方法。

if pgrep sidekiq >/dev/null 
then 
    echo "Process is running." 
else 
    echo "Process is not running." 
fi 
+1

嗯。很好的触摸:)我猜测该操作已经找出了问题的根源,就是'ps -aux |'这一行grep sidekiq>/dev/null'在他的脚本..特别我喜欢第二个解决方案,这是临床。 – sjsam

+0

@inian - grep -v grep完美运行,现在脚本正在运行。即使进程正在运行,当我在终端中运行时,pgrep sidekiq也不会给出任何结果。可能是因为sidekiq的作用方式? – iCyborg

+1

有没有必要重定向到'/ dev/null'。只需使用'-q'选项,即可使用'grep'或'pgrep'。 – ghoti

相关问题