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() |