利用systemctl让Python程序发生异常时自动重启

项目的中服务器发生异常会自动重启,这么久了也没关注到底是咋自动重启了,今天想来了看了一些,原来是利用systemctl服务完成,天天运行这个服务也没自己看内容,就当初部署看了一眼,今天搞了个程序测试了下。

Python代码:

import logging
import logging.handlers
import time
import random

def setup_logging(level=logging.DEBUG, stream=True, stream_level=logging.DEBUG,save_file=True, filename=''):
    formatter = logging.Formatter(
        '[%(levelname)1.1s %(asctime)s.%(msecs)03d %(name)s:%(lineno)d] %(message)s',
        datefmt='%y%m%d %H:%M:%S',
    )
    logging.getLogger().setLevel(level)
    if save_file:
        rotating_file_handler = logging.handlers.RotatingFileHandler(
            'server.log' if not filename else filename,
            mode='a',
            maxBytes=100*1024*1024,
            backupCount=10,
            encoding='utf-8',
        )
        rotating_file_handler.setFormatter(formatter)
        logging.getLogger().addHandler(rotating_file_handler)
    if stream:
        stream_handler = logging.StreamHandler()
        stream_handler.setFormatter(formatter)
        stream_handler.setLevel(stream_level)
        logging.getLogger().addHandler(stream_handler)

setup_logging(stream=True, save_file=True,filename='/home/wangjinyu/Desktop/server.log')
logger=logging.getLogger(__name__)

#核心代码
while True:
    a=random.randint(0,5)
    try:
        1/a
    except:
        如果发生异常就退出系统
        logger.debug('重启程序')
        exit(1)
    else:
        print(a)
        time.sleep(1)

然后自己在/usr/lib/systemd/system目录下写了个test.service文件,system目录不存在,自己创建的,systemctl命令貌似能自动找到这个目录下的服务,我换成其他路径就不行了

内容如下:

详细配置信息可以参考阮一峰老师的教程:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

[Unit]
Description=DM Servicer
After=network.target

[Service]
WorkingDirectory=/home/wangjinyu/work1/work_practice
User=wangjinyu

#Python解释器和执行文件,空格隔开
ExecStart=/usr/bin/python3 /home/wangjinyu/work1/work_practice/p_83_systemctl.py

#这里是配置如果程序失败就自动重启的设置
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动如下:

systemctl start test.sevice

 

查看日志:

tailf server.log

效果如下:

利用systemctl让Python程序发生异常时自动重启_第1张图片

不停的查看服务状态:

sudo systemctl status test.service

也会一直显示服务运行中 

利用systemctl让Python程序发生异常时自动重启_第2张图片

 

如果把test.service文件的Restart=on-failure注释掉

那么Python程序一旦发生异常执行exit(1)退出,就不在在启动了

你可能感兴趣的:(利用systemctl让Python程序发生异常时自动重启)