用于检查运行进程的Bash脚本

ela*_*ity 54 bash

我写了一个bash脚本来检查进程是否正在运行.它不起作用,因为ps命令总是返回退出代码1.当我从命令行运行ps命令时,$?是正确设置,但在脚本中它总是1.任何想法?

#!/bin/bash
SERVICE=$1

ps -a | grep -v grep | grep $1 > /dev/null
result=$?
echo "exit code: ${result}"
if [ "${result}" -eq "0" ] ; then
    echo "`date`: $SERVICE service running, everything is fine"
else
    echo "`date`: $SERVICE is not running"
fi
Run Code Online (Sandbox Code Playgroud)

Bash版本:GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)

And*_*dor 100

有一些非常简单的方法:

pgrep procname && echo Running 
pgrep procname || echo Not running 
killall -q -0 procname && echo Running 
pidof procname && echo Running
Run Code Online (Sandbox Code Playgroud)

  • 使用此`pgrep procname>/dev/null && echo Running`以避免pgrep输出PID (6认同)
  • 即使进程只包含您要查找的进程名称,您的方法也会返回结果。这不是检查确切名称的解决方案。 (2认同)

And*_*ers 14

在BASH版本3.2.29上试过你的版本,工作正常.但是,您可以执行上面提到的操作,例如:

#!/bin/sh

SERVICE="$1"
RESULT=`ps -a | sed -n /${SERVICE}/p`

if [ "${RESULT:-null}" = null ]; then
    echo "not running"
else
    echo "running"
fi
Run Code Online (Sandbox Code Playgroud)

  • 只是抬头:`ps -a`只列出当前终端中用户的进程.但是,`ps -A`检查所有进程. (3认同)

and*_*yue 12

这招对我的作品.希望这可以帮到你.让我们将以下内容保存为checkRunningProcess.sh

#!/bin/bash
ps_out=`ps -ef | grep $1 | grep -v 'grep' | grep -v $0`
result=$(echo $ps_out | grep "$1")
if [[ "$result" != "" ]];then
    echo "Running"
else
    echo "Not Running"
fi
Run Code Online (Sandbox Code Playgroud)

使checkRunningProcess.sh可执行.然后使用它.
使用示例.

20:10 $ checkRunningProcess.sh proxy.py
Running
20:12 $ checkRunningProcess.sh abcdef
Not Running
Run Code Online (Sandbox Code Playgroud)


小智 9

我使用这个来检查每10秒进程正在运行,如果没有则启动并允许多个参数:

#!/bin/sh

PROCESS="$1"
PROCANDARGS=$*

while :
do
    RESULT=`pgrep ${PROCESS}`

    if [ "${RESULT:-null}" = null ]; then
            echo "${PROCESS} not running, starting "$PROCANDARGS
            $PROCANDARGS &
    else
            echo "running"
    fi
    sleep 10
done    
Run Code Online (Sandbox Code Playgroud)


sud*_*uda 6

检查您的脚本名称是否不包含$ SERVICE.如果是,它将在ps结果中显示,导致脚本始终认为服务正在运行.您可以使用以下文件对当前文件名进行grep:

#!/bin/sh
SERVICE=$1
if ps ax | grep -v grep | grep -v $0 | grep $SERVICE > /dev/null
then
    echo "$SERVICE service running, everything is fine"
else
    echo "$SERVICE is not running"
fi
Run Code Online (Sandbox Code Playgroud)


小智 5

工作一个.

!/bin/bash
CHECK=$0
SERVICE=$1
DATE=`date`
OUTPUT=$(ps aux | grep -v grep | grep -v $CHECK |grep $1)
echo $OUTPUT
if [ "${#OUTPUT}" -gt 0 ] ;
then echo "$DATE: $SERVICE service running, everything is fine"
else echo "$DATE: $SERVICE is not running"
fi


And*_*ans 5

尽管在bash中使用/ dev/null方法取得了一些成功.当我将解决方案推送到cron时,它失败了.检查返回命令的大小工作得很好.ampersrand允许bash退出.

#!/bin/bash
SERVICE=/path/to/my/service
result=$(ps ax|grep -v grep|grep $SERVICE)
echo ${#result}
if  ${#result}> 0 
then
        echo " Working!"
else
        echo "Not Working.....Restarting"
        /usr/bin/xvfb-run -a /opt/python27/bin/python2.7 SERVICE &
fi
Run Code Online (Sandbox Code Playgroud)