Linux脚本,用于检查进程是否正在运行并对结果执行操作

lin*_*oob 32 linux bash grep process

我有一个定期失败的进程,有时会启动重复的实例..

当我运行: ps x |grep -v grep |grep -c "processname" 我会得到: 2 这是正常的,因为进程运行恢复过程..

如果我得到了, 0 我会想要启动这个过程: 4 我会想要停止并重新启动该过程

我需要的是一种取得结果的方法 ps x |grep -v grep |grep -c "processname"

然后设置一个简单的3选项功能

ps x |grep -v grep |grep -c "processname"
if answer = 0 (start process & write NOK & Time to log /var/processlog/check)
if answer = 2 (Do nothing & write OK & time to log /var/processlog/check)
if answer = 4 (stot & restart the process & write NOK & Time to log /var/processlog/check)
Run Code Online (Sandbox Code Playgroud)

该过程已停止, killall -9 process 该过程以此开始 process -b -c /usr/local/etc

我的主要问题是找到一种方法来对待结果ps x |grep -v grep |grep -c "processname".

理想情况下,我想将grep的结果作为脚本中的变量,如下所示:

process=$(ps x |grep -v grep |grep -c "processname")

如果可能的话.

Jot*_*tne 66

这是我用来监视系统上的进程是否正在运行的脚本.
脚本存储在crontab每分钟运行一次.

#! /bin/bash

case "$(pidof amadeus.x86 | wc -w)" in

0)  echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt
    /etc/amadeus/amadeus.x86 &
    ;;
1)  # all ok
    ;;
*)  echo "Removed double Amadeus: $(date)" >> /var/log/amadeus.txt
    kill $(pidof amadeus.x86 | awk '{print $1}')
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

0如果找不到进程,请重新启动它.
1如果找到了进程,一切正常.
*如果进程运行2或更多,则终止该进程.


一个更简单的版本.这只是测试进程是否正在运行,如果没有重新启动它.
它只是测试出口标志$?pidof程序.它将是0进程正在运行,1如果没有.

#!/bin/bash
pidof  amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
        echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt
        /etc/amadeus/amadeus.x86 &
fi
Run Code Online (Sandbox Code Playgroud)


Tir*_*ias 8

我采用了@Jotne解决方案并且完美运行!例如我的NAS中的mongodb服务器

#! /bin/bash

case "$(pidof mongod | wc -w)" in

0)  echo "Restarting mongod:"
    mongod --config mongodb.conf
    ;;
1)  echo "mongod already running"
    ;;
esac
Run Code Online (Sandbox Code Playgroud)


lin*_*oob 5

我已经根据我的情况采用了你的脚本 Jotne。

#! /bin/bash

logfile="/var/oscamlog/oscam1check.log"

case "$(pidof oscam1 | wc -w)" in

0)  echo "oscam1 not running, restarting oscam1:     $(date)" >> $logfile
    /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
    ;;
2)  echo "oscam1 running, all OK:     $(date)" >> $logfile
    ;;
*)  echo "multiple instances of oscam1 running. Stopping & restarting oscam1:     $(date)" >> $logfile
    kill $(pidof oscam1 | awk '{print $1}')
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

在我测试时,我遇到了一个问题。我用这一行启动了 oscam1 的 3 个额外进程: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 这给我留下了 8 个 oscam1 进程。问题是这样的..当我运行脚本时,它一次只杀死 2 个进程,所以我必须运行 3 次才能将它降到 2 个进程。

除了killall -9 oscam1其次/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1,在*)有没有更好的办法从原来的进程killall分开?那么会有零停机时间吗?