监控python程序

系统:Ubuntu18
目标:分别有两个python程序需要挂载到后台,并对其进行监控,若异常退出则重启(包括开机自启)。
软件:cron

  1. 安装及配置

(1)安装cron

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install cron

(2)本地日志配置

apt-get install rsyslog

配置:将corn.*前的#去掉即可,如下图所示:

vi /etc/rsyslog.d/50-default.conf

监控python程序_第1张图片
(3)重启rsyslog、corn

service rsyslog restart
service cron restart

(4)使用下面的命令可以查看cron的监控记录,比如你设置的10分钟扫描一次,那么正常的话该日志每10分钟就会新增一条记录

tail -f /var/log/cron.log
  1. 总体实现思路
    需求:有两个不同功能的py文件,需要满足每个py文件异常退出重启及开机自动重启
    首先分别对两个python程序写一个sh脚本(简称test.sh,test2.sh),每个sh脚本负责启动对应的python程序,然后再写一个总的脚本,不同条件下启动不同的脚本(即启动test.sh或test2.sh);然后使用cron负责监控,如果哪个程序失败了就重新启动哪个,1分钟扫描一次。注意:因为cron不能开机自启,所以需要单独设置一下开机自启。
  2. 实现
    test.sh如下:
#!/bin/bash
cd /root/autodl-tmp/模型 && nohup /root/miniconda3/bin/python organization.py > auto2.log 2>&1 &

test2.sh如下:

#!/bin/bash
cd /root/autodl-tmp/zb_project &&  nohup /root/miniconda3/bin/python zb.py > auto.log 2>&1 &
cd /root/autodl-tmp/zb_project &&  nohup /root/miniconda3/bin/python zb.py > auto.log 2>&1 &

监控脚本monitor.sh如下:

#!/bin/bash

script_names=('test.sh' 'test2.sh')  # 请替换为你的脚本名称

# 遍历每个脚本
for script_name in "${script_names[@]}"; do
    # 使用ps命令查找进程
    pid=`ps -ef | grep $script_name | grep -v grep | awk '{print $2}'`
    # 检查进程是否存在
    if [ -z "$pid" ]; then
        echo "$script_name 已停止运行,正在重新启动..."
        # 在这里,你需要根据实际情况启动你的脚本
        echo "/root/autodl-tmp/auto_start/$script_name"
        /bin/bash /root/autodl-tmp/auto_start/$script_name && echo "启动成功"
    else
        echo "$script_name 正在运行"
    fi
done

设置可执行权限:

chmod +x test.sh
chmod +x test2.sh
chmod +x monitor.sh

在cron里面添加定时监控任务

# 命令行输入下面命令,然后回车
 crontab -e

将monitor.sh打印的内容输出到error.log(>>是追加,>是覆盖),*/10代表的是10分钟扫描一次

# 回车后输入
*/10 * * * * /root/autodl-tmp/auto_start/monitor.sh >> /root/autodl-tmp/auto_start/error.log

监控python程序_第2张图片
cron开机自启
vi /etc/init.d/cron_start.sh

#!/bin/bash
### BEGIN INIT INFO
# Provides: cron_start
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
service cron start
service rsyslog start

设置脚本权限
90表明一个优先级,越高表示执行的越晚 (优先级范围:0~90)

cd /etc/init.d/
chmod +x cron_start.sh
update-rc.d cron_start.sh defaults 90

设置自启动

update-rc.d cron_start.sh enable

查看全部服务列表:

sudo service --status-all

[+] –具有此标志的服务当前正在运行。
[–] –具有此标志的服务当前未运行。
[?] –没有 状态开关的服务。

拓展:
服务的启动停止状态
xxx为启动服务的(脚本)名字

sudo service xxx status
sudo service xxx start
sudo service xxx stop
sudo service xxx restart

移除开机启动脚本

sudo update-rc.d -f new_service.sh remove

update-rc.d的详细参数
使用update-rc.d命令需要指定脚本名称和一些参数,它的格式看起来是这样的(需要在 root 权限下):

update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> defaults
update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
update-rc.d <basename> start|stop <NN> <runlevels>
参数解析:

-n: not really
-f: force
disable|enable:代表脚本还在/etc/init.d中,并设置当前状态是手动启动还是自动启动。
start|stop:代表脚本还在/etc/init.d中,开机,并设置当前状态是开始运行还是停止运行。(启用后可配置开始运行与否)
NN:是一个决定启动顺序的两位数字值。(例如90大于80,因此80对应的脚本先启动或先停止)
runlevels:则指定了运行级别。
vi /etc/profile
#在末尾添加下面代码
export TZ='CST-8'
source /etc/profile
mv /etc/localtime /etc/localtime_bak
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重启电脑

你可能感兴趣的:(python,开发语言,bash)