赞
踩
维护一个常时数据库更新软件时,遇见非常见自动关闭事件,且自动关闭时间间隔较长,暂时无法准确分析定位问题所在,故先写一个守护进程保证在掉线时拉起程序以暂时弥补漏洞。
守护进程主要分为两部分,一部分为检测目前目标进程是否正在运行,另一部分为在目标进程未在运行时尝试拉起程序。
检测进程是否正在运行直接采用ps并筛选的方法。
appFind=`ps -ef | grep $AppName | grep -v grep`
反引号作用为执行反引号内命令行语句并将执行结果的返回值赋给等号左侧变量,该行代码返回值为:若没有查询到进程信息则返回空,否则返回进程信息。
ps -ef查询目前运行进程(-e为所有进程,-f为全格式)
grep关键字筛选出包含定义好的需守护进程名的进程信息
grep -v grep同时再筛掉刚刚得到的信息中包含的自己正在执行的进程信息,-v为反筛选后面那条信息
findNum=${#appFind}
判断appFind查询返回的字符串长度,若为空则长度为零,否则长度不为0,以此作为判断是否执行目标程序的判断条件。
#!/bin/bash #虽然可以查询到脚本所在路径,然后通过所在路径确定程序绝对路径,但是如果程序有同目录下配置文件则无法正常启动 #因此建议在启动守护进程脚本时,进入到脚本与程序所在目录再执行。 #示例:cd /home/adm/desktop/app && ./Protect.sh & >/dev/null 2>&1 #其中最后的>/dev/null 2>&1是将脚本输出到空设备,也就是不显示直接删除可以减少显示,脚本后带&即允许后台运行 AppName=appname while true do #这里查询指定的app是否运行,查询的时候去除包含grep的结果,如果没有改进程,返回空字符串 appFind=`ps -ef | grep $AppName | grep -v grep` findNum=${#appFind} if [ findNum = 0 ];then #相对路径,执行与shell脚本同目录下的程序 ./AppName fi #每60秒查询一次,所以sleep60,根据所需调整,单位为秒 sleep 60 done
①进程名和程序名可能不同,所以在查询和拉起时可能会使用不同的变量、名字,请注意。
②示例中使用的路径为相对路径,需要该脚本与所需拉起的程序处于同一目录下,如需拉起更多不同目录下程序或有其他需求,请自己修改相对路径或者适当的使用绝对路径。
③在需要修改路径,即遇上②所需注意点时,还需注意,如所需拉起的程序需要同目录下的配置文件,则不能简单的通过修改路径来尝试拉起,应先cd进入所需拉起程序所在目录,调用./AppName尝试拉起,不然绝大部分情况下程序无法正确读取配置文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。