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)
我采用了@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)
我已经根据我的情况采用了你的脚本 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分开?那么会有零停机时间吗?