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

 更新时间:2026年06月26日 08:51:13   作者: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启动多个服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中实现文本预处理的方法小结

    Python中实现文本预处理的方法小结

    文本数据是数据科学和自然语言处理领域的关键组成部分,本文将深入探讨Python中文本预处理的关键步骤,并提供丰富的示例代码,希望对大家有所帮助
    2023-12-12
  • Python pyqt5下拉多选框的实现示例

    Python pyqt5下拉多选框的实现示例

    QComboBox是一个集按钮和下拉选项于一体的控件,本文主要介绍了Python pyqt5下拉多选框的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Python机器学习之K-Means聚类实现详解

    Python机器学习之K-Means聚类实现详解

    这篇文章主要为大家详细介绍了Python机器学习之K-Means聚类的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 讲清楚fit_transform()和transform()的区别及说明

    讲清楚fit_transform()和transform()的区别及说明

    这篇文章主要介绍了讲清楚fit_transform()和transform()的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 什么是Python中的顺序表

    什么是Python中的顺序表

    在本篇文章里小编给大家整理了一篇关于Python中顺序表详解的相关知识点以及实例内容,需要的朋友们可以参考下。
    2020-06-06
  • selenium学习教程之定位以及切换frame(iframe)

    selenium学习教程之定位以及切换frame(iframe)

    这篇文章主要给大家介绍了关于selenium学习教程之定位以及切换frame(iframe)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 基于K-Means聚类算法演示及可视化展示

    基于K-Means聚类算法演示及可视化展示

    这篇文章主要介绍了基于K-Means聚类算法演示及可视化展示,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python WSGI的深入理解

    Python WSGI的深入理解

    这篇文章主要给大家介绍了关于Python WSGI的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Python空间数据处理之GDAL读写遥感图像

    Python空间数据处理之GDAL读写遥感图像

    这篇文章主要介绍了Python空间数据处理之GDAL读写遥感图像,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 使用国内镜像源优化pip install下载的方法步骤

    使用国内镜像源优化pip install下载的方法步骤

    在Python开发中,pip 是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可能会遇到下载速度慢、连接不稳定等问题,所以本文将详细介绍如何使用国内镜像源来加速pip install -r requirements.txt的过程
    2025-03-03

最新评论