• qbit 在使用 Python 的 FastAPI 框架,在 Python 脚本中用 os.system 调用了 uvicorn 启动程序,调用链条大致如下
python3 main.py             # 进程 1
  -- sh python3 uvicorn     # 进程 2
      -- python3 uvicorn    # 进程 3
  • qbit 发现直接 kill 进程 1 或 进程 2,并不能终止进程 3。即 kill 某个进程,并不一定能终止该进程的子进程和孙子进程。
  • 于是通过找到孙子进程的方式来终止进程
  • 编写重启脚本如下
echo "重启 run_qbit 进程"
echo "获取进程 ID"
pid=`pgrep -f run_qbit`
# 杀掉孙子进程
if [ -z "$pid" ]; then
    echo "未找到需 kill 的 run_qbit 进程"
else
    echo "找到进程:"$pid", 即将 kill ..."
    kill `pgrep -P $(pgrep -P $pid)`
fi
echo "即将启动 run_qbit 进程 ..."
export CfgFile=/home/qbit/config.toml
nohup python /home/qbit/app/main.py run_qbit > /dev/null 2>&1 &
  • 脚本中的 run_qbit 是为了唯一定位入口进程,跟 Python 程序本身无关
qbit snap

qbit
268 声望279 粉丝