如何用Bash脚本启动两个独立虚拟环境中的Python微服务
一键启动双Python微服务的Bash脚本
脚本功能
该脚本会自动检查每个服务的虚拟环境,不存在则创建并安装依赖,随后在后台启动两个服务并记录运行日志,实现近乎同时启动的效果。
完整脚本
#!/bin/bash # 定义两个服务的目录 SERVICE_DIRS=( "/my_app/do_something" "/my_app/do_something_else" ) # 日志输出目录(可按需修改) LOG_DIR="/var/log/my_services" mkdir -p "$LOG_DIR" # 遍历处理每个服务 for DIR in "${SERVICE_DIRS[@]}"; do # 进入服务目录,失败则退出 cd "$DIR" || { echo "无法访问目录: $DIR"; exit 1; } # 检查虚拟环境,不存在则创建 if [ ! -d "venv" ]; then echo "为 $DIR 创建虚拟环境..." python3.10 -m venv venv [ $? -ne 0 ] && { echo "虚拟环境创建失败: $DIR"; exit 1; } fi # 激活虚拟环境并安装/更新依赖 echo "为 $DIR 同步依赖..." source venv/bin/activate pip install -r requirements.txt --upgrade deactivate # 后台启动服务并输出日志 SERVICE_NAME=$(basename "$DIR") echo "启动服务: $SERVICE_NAME" source venv/bin/activate nohup python main.py > "$LOG_DIR/$SERVICE_NAME.log" 2>&1 & deactivate # 记录服务PID,方便后续停止 echo $! > "$DIR/$SERVICE_NAME.pid" done echo "所有服务已启动,日志路径: $LOG_DIR"
使用步骤
- 将脚本保存为
start_services.sh - 赋予执行权限:
chmod +x start_services.sh - 运行脚本:
./start_services.sh
配套操作建议
- 停止服务:执行以下命令停止单个服务,或编写配套停止脚本:
# 停止do_something服务 kill $(cat /my_app/do_something/do_something.pid) # 停止do_something_else服务 kill $(cat /my_app/do_something_else/do_something_else.pid) - 查看实时日志:
tail -f /var/log/my_services/do_something.log - 开机自启:推荐创建systemd服务单元(稳定性更高),示例配置如下:
保存为[Unit] Description=My Python Services After=postgresql.service [Service] Type=forking ExecStart=/path/to/start_services.sh User=your_username [Install] WantedBy=multi-user.target/etc/systemd/system/my_services.service后,执行sudo systemctl daemon-reload && sudo systemctl enable --now my_services
注意事项
- 确保系统已安装
python3.10-venv包,未安装则执行sudo apt install python3.10-venv - 脚本需对服务目录和日志目录拥有读写权限
- 若服务依赖Postgres,可在脚本开头加入
systemctl is-active --quiet postgresql || sudo systemctl start postgresql(需脚本有sudo权限)
内容的提问来源于stack exchange,提问作者Kai Chaza
相关产品推荐
相关产品推荐

