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 

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

有几个非常简单的方法:

 pgrep procname && echo Running pgrep procname || echo Not running killall -q -0 procname && echo Running pidof procname && echo Running 

尝试在BASH版本3.2.29您的版本,工作正常。 不过,你可以做一些像上面这样的build议,这里就是一个例子:

 #!/bin/sh SERVICE="$1" RESULT=`ps -a | sed -n /${SERVICE}/p` if [ "${RESULT:-null}" = null ]; then echo "not running" else echo "running" fi 

我使用这个检查每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 

这个把戏适合我。 希望这可以帮助你。 我们将下面的内容保存为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 

使checkRunningProcess.sh可执行文件,然后使用它。
使用示例。

 20:10 $ checkRunningProcess.sh proxy.py Running 20:12 $ checkRunningProcess.sh abcdef Not Running 

工作一个。

 !/斌/庆典
 CHECK = $ 0
 SERVICE = $ 1
 DATE =`date`
 OUTPUT = $(ps aux | grep -v grep | grep -v $ CHECK | grep $ 1)
 echo $ OUTPUT
 if [“$ {#OUTPUT}”-gt 0];
然后echo“$ DATE:$ SERVICE服务运行,一切都很好”
否则回声“$date:$服务没有运行”
科幻

尽pipebash中的/ dev / null方法取得了一些成功。 当我将解决scheme推向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 
 #!/斌/庆典
 ps axho comm |  grep $ 1> / dev / null
结果= $?
回声“退出代码:$ {result}”
如果[“$ {result}”-eq“0”]; 然后
回声“date”:$ SERVICE服务运行,一切都很好“
其他
回声“`date”:$ SERVICE没有运行“
 /etc/init.d/$1重新启动
科幻

像这样的东西

检查您的脚本名称是否不包含$ 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 

这些是有用的提示。 我只需要知道在启动脚本时服务是否正在运行,所以当我离开时我可以将服务保持在相同的状态。 我结束了使用这个:

  HTTPDSERVICE=$(ps -A | grep httpd | head -1) [ -z "$HTTPDSERVICE" ] && echo "No apache service running." 

我发现了这个问题。 ps -ae改为ps -a的作品。

我想这与我在共享主机环境中的权利有关。 从命令行执行“ps -a”和从bash脚本执行它之间显然是有区别的。

一个简单的脚本版本的安道尔的以上build议之一:

 !/bin/bash pgrep $1 && echo Running 

如果上面的脚本被称为test.sh,那么为了testing,input:test.sh NameOfProcessToCheck

例如test.sh php

我想知道在进程中进行渐进式尝试是否是一个好主意,所以你通过这个func一个进程名称func_terminate_process“firefox”,它会先磨合更好的东西,然后继续杀。

 # -- NICE: try to use killall to stop process(s) killall ${1} > /dev/null 2>&1 ;sleep 10 # -- if we do not see the process, just end the function pgrep ${1} > /dev/null 2>&1 || return # -- UGLY: Step trough every pid and use kill -9 on them individually for PID in $(pidof ${1}) ;do echo "Terminating Process: [${1}], PID [${PID}]" kill -9 ${PID} ;sleep 10 # -- NASTY: If kill -9 fails, try SIGTERM on PID if ps -p ${PID} > /dev/null ;then echo "${PID} is still running, forcefully terminating with SIGTERM" kill -SIGTERM ${PID} ;sleep 10 fi done # -- If after all that, we still see the process, report that to the screen. pgrep ${1} > /dev/null 2>&1 && echo "Error, unable to terminate all or any of [${1}]" || echo "Terminate process [${1}] : SUCCESSFUL" 

我需要不时地执行这个操作,并最终破解命令行直到它工作。

例如,在这里我想查看是否有任何SSH连接(由“ps”返回的第8列是正在运行的“path-to-procname”),并且被“awk”过滤:

 ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g' 

然后我把它放在一个shell脚本中(“eval” – 反引号内的命令行),如下所示:

 #!/bin/bash VNC_STRING=`ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g'` if [ ! -z "$VNC_STRING" ]; then echo "The VNC STRING is not empty, therefore your process is running." fi 

“sed”部分修剪path到确切的标记,可能不需要您的需要。

这是我用来获得答案的例子。 我写它自动创build2 SSH隧道,并启动每个VNC客户端。

我从我的Cygwin shell运行它从我的Windows工作站做到我的后端,所以我可以用一个命令跳到UNIX / LINUX-land(这也假定客户端rsa键已经是“ssh-copy-id”并且被远程主机所知)。

这是幂等的,每个proc /命令只在$ VAR eval为空string时触发。

它附加“| wc -l”来存储匹配的正在运行的proc的数量(即find的行数),而不是每个$ VAR的proc-name,以满足我的需要。 我保留“回声”语句,以便我可以重新运行并诊断两个连接的状态。

 #!/bin/bash SSH_COUNT=`eval ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g' | wc -l` VNC_COUNT=`eval ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g' | wc -l` if [ $SSH_COUNT = "2" ]; then echo "There are already 2 SSH tunnels." elif [ $SSH_COUNT = "1" ]; then echo "There is only 1 SSH tunnel." elif [ $SSH_COUNT = "0" ]; then echo "connecting 2 SSH tunnels." ssh -L 5901:localhost:5901 -f -l USER1 HOST1 sleep 10; ssh -L 5904:localhost:5904 -f -l USER2 HOST2 sleep 10; fi if [ $VNC_COUNT = "2" ]; then echo "There are already 2 VNC sessions." elif [ $VNC_COUNT = "1" ]; then echo "There is only 1 VNC session." elif [ $VNC_COUNT = "0" ]; then echo "launching 2 vnc sessions." vncviewer.exe localhost:1 & vncviewer.exe localhost:4 & fi 

这对我来说很像perl-like,可能比真正的shell脚本更多的是unix utils。 我知道有很多“魔术”数字和硬朗的硬编码价值,但它的工作原理(我认为我也是在尝试使用这么多的大写字母)。 灵活性可以添加一些CMD线参数,使这更多function,但我想分享什么对我有用。 请改善和分享。 干杯。

带有serviceawk解决scheme,用逗号分隔的服务名称列表。

首先,这可能是一个很好的select,你需要root权限来做你想做的事情。 如果你不需要检查,那么你可以删除该部分。

 #!/usr/bin/env bash # First parameter is a comma-delimited string of service names ie service1,service2,service3 SERVICES=$1 ALL_SERVICES_STARTED=true if [ $EUID -ne 0 ]; then if [ "$(id -u)" != "0" ]; then echo "root privileges are required" 1>&2 exit 1 fi exit 1 fi for service in ${SERVICES//,/ } do STATUS=$(service ${service} status | awk '{print $2}') if [ "${STATUS}" != "started" ]; then echo "${service} not started" ALL_SERVICES_STARTED=false fi done if ${ALL_SERVICES_STARTED} ; then echo "All services started" exit 0 else echo "Check Failed" exit 1 fi 

按进程名称最简单的检查:

  bash -c 'checkproc ssh.exe ; while [ $? -eq 0 ] ; do echo "proc running";sleep 10; checkproc ssh.exe; done'