python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python启动多个服务

python中启动多个服务的三种方法详解

作者:bst@微胖子

本文介绍了在Python项目中并行启动多个服务的方法,包括使用命令行、Python脚本管理和使用Supervisor等工具,并提供了基础脚本一键启动方案,适用于不同环境需求

一、问题背景

在Python项目中,如果你想要同时启动多个服务,特别是如果你的项目中包含一个使用FastAPI的API服务和另一个可能使用其他框架或脚本的服务,你可以通过几种不同的方式来实现。

二、启动多个服务方法

1. 使用命令行

方法一:使用&在命令行中并行运行

在Unix-like系统(如Linux和macOS)中,你可以在命令行中使用&来并行运行两个服务。例如,如果你有两个Python脚本app1.py和app2.py,你可以这样启动它们:

python app1.py & python app2.py

方法二:使用nohup来保持服务在后台运行

如果你想要让服务在后台运行即使关闭了终端,可以使用nohup命令:

nohup python app1.py &
nohup python app2.py &

2. 使用Python脚本管理多个进程

你可以编写一个Python脚本来管理多个进程。例如,使用subprocess模块:

import subprocess
import os

# 启动FastAPI服务
fastapi_process = subprocess.Popen(['python', 'app1.py'])

# 启动其他服务
other_service_process = subprocess.Popen(['python', 'app2.py'])

# 等待所有进程完成(如果需要)
fastapi_process.wait()
other_service_process.wait()

3. 使用Supervisor或类似的进程管理工具(推荐)

对于更复杂的应用,你可以使用像Supervisor这样的进程管理工具。Supervisor可以让你轻松地管理多个进程,并且可以配置它们在崩溃时自动重启。

1.安装Supervisor:

pip install supervisor

2.配置Supervisor:

[program:fastapi]
command=python app1.py
autostart=true
autorestart=true
stderr_logfile=/var/log/fastapi.err.log
stdout_logfile=/var/log/fastapi.out.log
[program:otherservice]
command=python app2.py
autostart=true
autorestart=true
stderr_logfile=/var/log/otherservice.err.log
stdout_logfile=/var/log/otherservice.out.log

3.启动Supervisor:

supervisord -c /etc/supervisor/supervisord.conf

4.检查状态或控制进程:

supervisorctl status
supervisorctl start fastapi
supervisorctl stop otherservice

三、脚本一键启动

方法一:基础并行启动脚本(简单版)

适用于快速启动多个服务,直接在后台运行,输出日志到文件。

步骤 1:创建启动脚本

在 Python 项目目录下新建 start_services.sh,内容如下:

#!/bin/bash
# 定义日志文件路径(可选,建议添加,便于排查问题)
LOG_DIR="./logs"
mkdir -p $LOG_DIR  # 确保日志目录存在
# 启动 Service 1(端口 8081),后台运行并输出日志
echo "Starting Service 1..."
python3 service1.py > $LOG_DIR/service1.log 2>&1 &
SERVICE1_PID=$!  # 记录进程 ID,可选(用于后续关闭服务)
# 启动 Service 2(端口 8082),后台运行并输出日志
echo "Starting Service 2..."
python3 service2.py > $LOG_DIR/service2.log 2>&1 &
SERVICE2_PID=$!
# 输出启动成功信息和进程 ID
echo "Services started successfully!"
echo "Service 1 PID: $SERVICE1_PID (log: $LOG_DIR/service1.log)"
echo "Service 2 PID: $SERVICE2_PID (log: $LOG_DIR/service2.log)"

指定端口(带端口参数):

#!/bin/bash
# 定义日志文件路径
LOG_DIR="./logs"
mkdir -p $LOG_DIR
# 启动 Service 1(端口 8081)
echo "Starting Service 1 on port 8081..."
python3 service1.py --port 8081 > $LOG_DIR/service1.log 2>&1 &
SERVICE1_PID=$!
# 启动 Service 2(端口 8082)
echo "Starting Service 2 on port 8082..."
python3 service2.py --port 8082 > $LOG_DIR/service2.log 2>&1 &
SERVICE2_PID=$!
echo "Services started successfully!"
echo "Service 1 (Port 8081) PID: $SERVICE1_PID"
echo "Service 2 (Port 8082) PID: $SERVICE2_PID"

方法二:带错误处理和依赖检查的增强版

适用于生产环境,添加环境检查、启动失败提示、统一日志目录等功能。

增强脚本 start_services.sh

#!/bin/bash
# 配置参数
PYTHON_CMD="python3"  # Python 命令(若用虚拟环境,需改为绝对路径,如 /path/to/venv/bin/python)
SERVICE1_SCRIPT="service1.py"
SERVICE2_SCRIPT="service2.py"
LOG_DIR="./logs"
PID_DIR="./pids"  # 保存 PID 文件,便于统一管理
# 创建目录
mkdir -p $LOG_DIR $PID_DIR
# 检查 Python 环境
if ! command -v $PYTHON_CMD &> /dev/null; then
    echo "Error: $PYTHON_CMD not found! Please install Python 3."
    exit 1
fi
# 检查服务脚本是否存在
for script in $SERVICE1_SCRIPT $SERVICE2_SCRIPT; do
    if [ ! -f "$script" ]; then
        echo "Error: Script $script not found in current directory!"
        exit 1
    fi
done
# 启动服务的函数(复用逻辑)
start_service() {
    local script=$1
    local port=$2  # 服务端口(用于日志区分)
    local log_file="$LOG_DIR/service_${port}.log"
    local pid_file="$PID_DIR/service_${port}.pid"
    echo "Starting $script on port $port..."
    $PYTHON_CMD $script > $log_file 2>&1 &
    local pid=$!
    echo $pid > $pid_file  # 保存 PID 到文件
    # 检查是否启动成功(5秒超时)
    sleep 2
    if ps -p $pid > /dev/null; then
        echo "Success: $script started (PID: $pid, log: $log_file)"
    else
        echo "Error: $script failed to start! Check log: $log_file"
        rm -f $pid_file  # 启动失败,删除 PID 文件
    fi
}
# 启动两个服务(传入脚本和端口)
start_service $SERVICE1_SCRIPT 8081
start_service $SERVICE2_SCRIPT 8082
echo "All services startup completed."

指定端口(带端口参数):

#!/bin/bash
# 配置参数
PYTHON_CMD="python3"
SERVICE1_SCRIPT="service1.py"
SERVICE2_SCRIPT="service2.py"
PORT1=8081
PORT2=8082
LOG_DIR="./logs"
PID_DIR="./pids"
# 创建目录
mkdir -p $LOG_DIR $PID_DIR
# 检查 Python 环境和脚本
if ! command -v $PYTHON_CMD &> /dev/null; then
    echo "Error: $PYTHON_CMD not found!"
    exit 1
fi
for script in $SERVICE1_SCRIPT $SERVICE2_SCRIPT; do
    if [ ! -f "$script" ]; then
        echo "Error: Script $script not found!"
        exit 1
    fi    fi
done
# 启动服务的函数
start_service() {
    local script=$1
    local port=$2
    local name=$3
    local log_file="$LOG_DIR/${name}.log"
    local pid_file="$PID_DIR/${name}.pid"
    echo "Starting $name on port $port..."
    $PYTHON_CMD $script --port $port > $log_file 2>&1 &
    local pid=$!
    echo $pid > $pid_file
    # 等待几秒检查服务是否正常启动
    sleep 3
    if ps -p $pid > /dev/null; then
        echo "✅ Success: $name started (PID: $pid, Port: $port)"
        return 0
    else
        echo "❌ Error: $name failed to start! Check log: $log_file"
        rm -f $pid_file
        return 1
    fi
}
# 启动两个服务
start_service $SERVICE1ERVICE1_SCRIPT $PORT1 "service1"
start_service $SERVICE2_SCRIPT $PORT2 "service2"
echo ""
echo "🎉 All services startup completed."
echo "📝 Logs location: $LOG_DIR/"
echo "📋 Process IDs saved in: $PID_DIR/"

到此这篇关于python中启动多个服务的三种方法详解的文章就介绍到这了,更多相关python启动多个服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文