持久化的python服务
进程守护指的是让一个程序在后台持续运行,具有自我恢复能力(崩溃自动重启),随系统启动自动启动,并可通过命令进行控制。
1. linux下systemd 持久守护 Python 程序
创建systemd服务配置文件:
1 | sudo nano /etc/systemd/system/myscript.service |
内容:
1 | [Unit] |
启用并启动服务:
1 | sudo systemctl daemon-reexec |
查看日志和状态:
1 | sudo systemctl status myscript.service |
通过命令进行控制:
1 | sudo systemctl stop myscript.service |
2. 跨平台python进程管理工具supervisord
supervisord 是一个用 Python 编写的进程管理工具, 它可以监控、启动、停止、重启你python脚本在内的进程。可以直接利用pip下载:
1 | pip install supervisor |
Supervisor 由两个核心组件组成:
- supervisord守护进程:负责读取配置、启动/监控任务
- supervisorctl命令行客户端:用于查看状态、重启任务等
使用时,首先生成一个默认的配置:
1 | echo_supervisord_conf > supervisord.conf |
将需要守护的进程添加到配置文件中:
1 | [program:my_script] |
参数 | 含义 |
---|---|
command | 要执行的命令 |
directory | 工作目录 |
autostart | 启动 supervisord 时自动启动 |
autorestart | 异常退出后是否自动重启 |
startsecs | 启动后运行多少秒才算成功 |
stdout_logfile | 标准输出日志路径 |
stderr_logfile | 错误日志路径 |
启动supervisord守护进程: |
1 | supervisord -c supervisord.conf |
和systemd一样,supervisord也有一些管理任务的命令:
1 | supervisorctl -c supervisord.conf status |
也可以利用supervisord进行不同gpu任务分发,不同gpu上运行不同进程并守护的骚操作,首先,在你的模型任务代码中加上通过参数指定gpu的逻辑:
1 | import torch |
然后,指定不同的gpu进行进程守护:
1 | [program:worker1] |
3. Docker + restart policy
Docker 提供了一种机制叫做 restart policy(重启策略),用来控制当容器退出或系统重启时,是否自动重启该容器。
对于一个Dockerfile,可以加上 --restart always运行。
1 | docker build -t my-capture . |
这个容器中的 Python 脚本崩溃时自动重启。
当然,在docker-compose.yml 中可以这样配置:
1 | services: |
当然,如果想要在linux中开机自启动容器,除了上面的,只要再使得docker自动启动即可:
1 | sudo systemctl enable docker |
这个命令会把 Docker 服务注册到 systemd 中,下次系统启动时会自动启动 Docker 服务, 也就自动拉起了 --restart always 的容器。
设置完之后,你可以检查一下重启策略是否配置好:
1 | docker inspect your_container_name | grep -i restart |