1、前言
在linux系统中运行一个应用程序,通常需要使用一个shell脚本程序来启动应用程序,并且监控应用程序是否在运行,如果应用程序故障自己退出就需要通过shell脚本程序来启动它。其实shell脚本程序就是一个很简单的程序逻辑来监测一个复杂的应用程序,类似于在嵌入式软件开发中单片机中使用看门狗来监测程序是否运行,不运行了就复位芯片让程序重新运行的功能。看来在所有软件开发的过程中都存在看门狗这个角色。
2、shell脚本的写法
下面一段是一个守护shell脚本程序的写法,这个shell脚本用于启动testplt_capalyzer_main.py程序和eiota_server两个程序。启动这两个程序后,每16秒监测一下这两个程序的进程,如果没有进程了就重新启动这两个程序。
#!/bin/bash
#定义一个变量,用于存储密码
keyword="Iot001"
#定义启动testplt_capalyzer_main.py程序的函数,&运行在后台
start_acnd(){
cd /home/eiota/testplt/python/
echo $keyword | sudo -S python3.8 testplt_capalyzer_main.py &
}
#定义启动eiota_server程序的函数,&运行在后台
start_eiota_server(){
cd /home/eiota/testplt/
./eiota_server &
}
#重新启动testplt_capalyzer_main.py程序
restart_acnd(){
echo ""
echo "======================== kill_acnd =========================="
#查询testplt_capalyzer_main.py程序在运行,获取运行进程的数量,程序在运行时返回的进程数量为2,没有运行返回0, grep -v grep表示过滤掉带 grep的行,因为执行以下脚本会有一个带grep的进程,wc -l表示获取行数
monitor=`ps -ef | grep "python3.8 testplt_capalyzer_main.py" | grep -v grep | wc -l`
if [ $monitor -ne 0 ]
then
#查询testplt_capalyzer_main.py程序在运行,获取运行进程的ID号, grep -v grep表示过滤掉带 grep的行,因为执行以下脚本会有一个带grep的进程,cut -c 9-5表示截取进程号, xargs表示把输入转换成命令行参数, kill - 9表示强制删除进程
echo $keyword | sudo -S ps -ef | grep "python3.8 testplt_capalyzer_main.py" | grep -v grep | cut -c 9-15 | xargs sudo kill -9
fi
start_acnd
echo "============================================================="
echo ""
echo ""
}
endT=$(( $(date +%s) + 36000 ))
while true
do
monitor=`ps -ef | grep "eiota_server" | grep -v grep | wc -l`
if [ $monitor -eq 0 ]
then
echo "eiota_server is not running, restart program."
start_eiota_server
sleep 20
restart_acnd
fi
sleep 6
monitor=`ps -ef | grep "python3.8 testplt_capalyzer_main.py" | grep -v grep | wc -l`
if [ $monitor -eq 0 ]
then
start_acnd
fi
sleep 10
curT=$(date +%s)
if [ $curT -gt $endT ]
then
echo 1 > /proc/sys/vm/drop_caches
endT=$(( $(date +%s) + 36000 ))
fi
done
3、复杂脚本的执行结果记录
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py
eiota 4842 9647 0 18:35 pts/1 00:00:00 grep --color=auto testplt_capalyzer_main.py
root 30864 1138 0 7月29 ? 00:00:00 sudo -S python3.8 testplt_capalyzer_main.py
root 30866 30864 7 7月29 ? 1-02:00:58 python3.8 testplt_capalyzer_main.py
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep
root 30864 1138 0 7月29 ? 00:00:00 sudo -S python3.8 testplt_capalyzer_main.py
root 30866 30864 7 7月29 ? 1-02:00:59 python3.8 testplt_capalyzer_main.py
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep | wc -l
2
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py
eiota 4842 9647 0 18:35 pts/1 00:00:00 grep --color=auto testplt_capalyzer_main.py
root 30864 1138 0 7月29 ? 00:00:00 sudo -S python3.8 testplt_capalyzer_main.py
root 30866 30864 7 7月29 ? 1-02:00:58 python3.8 testplt_capalyzer_main.py
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep
root 30864 1138 0 7月29 ? 00:00:00 sudo -S python3.8 testplt_capalyzer_main.py
root 30866 30864 7 7月29 ? 1-02:00:59 python3.8 testplt_capalyzer_main.py
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep | wc -l
2
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep | cut -c 9-15
30864
30866
xargs 把上面的2行进行号变成一行
eiota@eiota-Default-string:~/testplt$ ps -ef | grep testplt_capalyzer_main.py | grep -v grep | cut -c 9-15 | xargs
30864 30866