使用supervisor管理python脚本守护进程踩的一个坑

使用supervisor管理python脚本守护进程踩的一个坑

脚本内容

#!/bin/bash

export LD_LIBRARY_PATH=/root/FRI_FACEID/instantclient_12_1
export ORACLE_HOME=/root/FRI_FACEID/instantclient_12_1

source ../env/bin/activate
python -u ./new_whitelist_mb.py

问题

shell

都是通过最后一个进程启动的,但是这个进程结束后,他所运行的python脚本创建的进程并没有结束,supervisor管理的他会帮你启动脚本并管理这个程序,supervisorctl start 启动这个程序的时候会创建一个进程并记录下这个进程的PID,当执行supervisorctl stop 然后再kill 了这个PID号的进程,但是,由这个脚本所创建的子进程并没办法管理,所以才出现了如上图的情况。

解决

#!/bin/bash

export LD_LIBRARY_PATH=/root/FRI_FACEID/instantclient_12_1
export ORACLE_HOME=/root/FRI_FACEID/instantclient_12_1

source ../env/bin/activate
exec python -u ./new_whitelist_mb.py

Linux系统exec函数可以把当前进程替换为一个新进程,且新进程与原进程有相同的PID。

这样supervisor在管理stop程序的时候就能够通过之前记录的PID来kill掉现在的进程。

Note: 在脚本中使用exec,exec会替换掉原进程,而且执行完会退出,不会执行下面的,类似于python的retrun,所以使用的时候下面不要再写内容。

文章目录
  1. 1. 使用supervisor管理python脚本守护进程踩的一个坑
    1. 1.1. 脚本内容
    2. 1.2. 问题
    3. 1.3. 解决
|