linux shell守护脚本的详解

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值