守护进程
读取配置文件的参数,根据参数去守护对应的进程,参数的设置可以由对应进程的启动脚本去更新参数;
守护脚本内容
#!/bin/bash
conf=./daemon.conf #配置文件
if [ ! -d "/opt/ros/log/daemon/" ]; then
mkdir /opt/ros/log/daemon/
fi
log=/opt/ros/log/daemon/daemon-`date "+%Y-%m-%d"`.log
app_num=0 #记录进程数
app_start=() #进程启动脚本名
app=() #进程名
app_status=() #进程是否需要守护状态,1:守护,0:不守护
cat /dev/null > $conf #清空配置文件
echo `date "+%Y-%m-%d %H:%M:%S.%4N"` "daemon start" >> $log
#读取配置文件的参数
read_conf()
{
app_num=0
while read line
do
app_start[$app_num]=`echo $line | awk -F ':' '{print $1}'`
app[$app_num]=`echo $line | awk -F ':' '{print $2}' | awk -F '=' '{print $1}'`
app_status[$app_num]=`echo $line | awk -F '=' '{print $2}'`
#echo "${app_start[$app_num]}:${app[$app_num]}=${app_status[$app_num]}"
((app_num++))
done < $conf
}
#守护进程
while true
do
sleep 3
read_conf
for((i=0;i<$app_num;i++))
do
#不需要守护的跳过
if [ ${app_status[$i]} != 1 ];then
continue
fi
#需要守护的进行判断守护
ps_num=`ps aux | grep -w $app | grep -v grep |wc -l`
if [ "${ps_num}" -lt "1" ];then
echo `date "+%Y-%m-%d %H:%M:%S.%4N"` "The ${app[$i]} process has not been found, now run it" >> $log
./${app_start[$i]} start
elif [ "${ps_num}" -gt "1" ];then
echo `date "+%Y-%m-%d %H:%M:%S.%4N"` "more than 1 ${app[$i]}, killall ${app[$i]}" >> $log
./${app_start[$i]} stop
sleep 0.1
./${app_start[$i]} start
fi
done
done
配置文件参数格式
进程启动脚本名字:进程应用名字=守护状态(1需要守护,0不需要守护)
例:
S10-zhi:zhi=1
S11-cary:cary=0
启动脚本
用启动脚本开启进程,与守护进程脚本配合使用,可扩展性好
#!/bin/bash
conf=./daemon.conf #配置文件
enable=1 #守护进程开启
disable=0 #守护进程关闭
app=workstation #进程名
#app_start #进程启动脚本名
#更新守护进程配置文件参数
write_conf()
{
while read line
do
tmp=`echo $line | awk -F ':' '{print $2}' | awk -F '=' '{print $1}'`
if [ $tmp = $app ];then
break
fi
done < $conf
app_start=S`echo $0 | awk -F "/S" '{print $2}'` #进程启动脚本名
if [ "$tmp" != "$app" ];then
echo "$app_start:$app=$1" >> $conf #没有参数,追加参数
else
sed -i s/.*$app_start:$app=.*/$app_start:$app=$1/g $conf #有参数替换参数
fi
}
case "$1" in
start)
$app &
sleep 0.1
write_conf $enable
echo "$app start"
;;
stop)
write_conf $disable
sleep 0.1
killall -9 $app
echo "$app stop"
;;
restart)
killall -9 $app
$app &
sleep 0.1
write_conf $enable
echo "$app restart"
;;
*)
exit 1
esac