72 lines
3.0 KiB
Python
72 lines
3.0 KiB
Python
|
|
|
|||
|
|
import subprocess
|
|||
|
|
import time
|
|||
|
|
import os
|
|||
|
|
import psutil
|
|||
|
|
from loguru import logger
|
|||
|
|
|
|||
|
|
# 定义要启动的程序和命令
|
|||
|
|
binary_command = "cd /home/evan/Workplace/project_capture/build/; ./capture" # 替换为你的二进制程序路径
|
|||
|
|
conda_envs = [
|
|||
|
|
{"env": "conda_venv", "path": "/home/evan/Workplace/project_infer/lane_server/", "script": "python lane_infer_server.py"},
|
|||
|
|
{"env": "conda_venv", "path": "/home/evan/Workplace/project_infer/yolo_server/", "script": "python yolo_infer_server.py"},
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
def kill_processes_by_name(process_name):
|
|||
|
|
"""
|
|||
|
|
终止所有具有指定名称的进程。
|
|||
|
|
"""
|
|||
|
|
for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
|
|||
|
|
try:
|
|||
|
|
# 检查进程名是否包含给定的字符串
|
|||
|
|
if process_name.lower() in proc.info['name'].lower() or process_name.lower() in ' '.join(proc.info['cmdline']).lower():
|
|||
|
|
logger.warning(f"Killing {proc.info['name']} (PID: {proc.info['pid']})")
|
|||
|
|
proc.kill()
|
|||
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
# 启动函数,用于启动并监控一个进程
|
|||
|
|
def start_and_monitor_process(cmd, env=None):
|
|||
|
|
process = subprocess.Popen(cmd, shell=True, env=env)
|
|||
|
|
# while process.poll() is None: # 等待进程结束
|
|||
|
|
# time.sleep(1) # 可以根据需要调整等待时间
|
|||
|
|
# return process.returncode # 返回进程退出码
|
|||
|
|
|
|||
|
|
# 主程序
|
|||
|
|
def main():
|
|||
|
|
# 启动二进制程序
|
|||
|
|
|
|||
|
|
logger.error("hi")
|
|||
|
|
|
|||
|
|
kill_processes_by_name("capture")
|
|||
|
|
binary_returncode = start_and_monitor_process(binary_command)
|
|||
|
|
|
|||
|
|
time.sleep(2)
|
|||
|
|
|
|||
|
|
logger.info("start python script")
|
|||
|
|
# 为每个 conda 环境启动 Python 脚本
|
|||
|
|
conda_procs = []
|
|||
|
|
for env_info in conda_envs:
|
|||
|
|
logger.info(f"start {env_info['script']}")
|
|||
|
|
# 激活 conda 环境并运行脚本(这里假设你使用的是 bash shell)
|
|||
|
|
activate_cmd = f"cd {env_info['path']}; {env_info['script']}"
|
|||
|
|
# activate_cmd = f"conda activate {env_info['env']}; {env_info['script']}"
|
|||
|
|
# 注意:在某些系统上,可能需要使用 `conda activate` 而不是 `source activate`
|
|||
|
|
# 并且可能需要设置 CONDA_PREFIX 等环境变量
|
|||
|
|
env = os.environ.copy()
|
|||
|
|
# 如果有需要传递给子 shell 的环境变量,可以在这里设置
|
|||
|
|
# 例如:env["CONDA_PREFIX"] = ...
|
|||
|
|
conda_proc = subprocess.Popen(["bash", "-c", activate_cmd], env=env)
|
|||
|
|
conda_procs.append(conda_proc)
|
|||
|
|
|
|||
|
|
# 等待所有 conda 环境中的 Python 脚本完成
|
|||
|
|
for proc in conda_procs:
|
|||
|
|
proc.wait() # 等待进程结束,但不会轮询检查
|
|||
|
|
|
|||
|
|
# 打印提示信息
|
|||
|
|
print(f"Binary program exited with code {binary_returncode}")
|
|||
|
|
for idx, proc in enumerate(conda_procs):
|
|||
|
|
print(f"{env_info['script']} script exited with code {proc.returncode}")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|