如何在远程多台机器同时运行非终止型Python脚本?
解决远程启动多个非终止Python脚本的阻塞问题
最直接的方式是将每个脚本放到后台运行,同时避免SSH会话关闭后进程被终止,以下是几种可行方案:
方案1:后台运行 + nohup(最可靠)
修改你的init_all_processes.sh脚本,给每个Python命令添加nohup和后台运行符号&,同时丢弃日志输出:
#!/bin/bash # 将每个进程放到后台并忽略HUP信号,丢弃所有输出 sudo nohup python3 /home/proj1/webServer.py >/dev/null 2>&1 & sudo nohup python3 /home/proj2/server/main.py >/dev/null 2>&1 & sudo nohup python3 /home/proj1/test/test_server.py >/dev/null 2>&1 & sudo nohup python3 /home/proj2/process_receiving_images.py >/dev/null 2>&1 &
&:让当前进程在后台执行,不阻塞后续命令nohup:使进程忽略SSH会话关闭时发送的HUP信号,保证进程持续运行>/dev/null 2>&1:将标准输出和错误输出全部丢弃,满足你无需日志的需求
执行命令保持不变:
ssh root@MachineB 'bash -s' < init_all_processes.sh
方案2:后台运行 + SSH -f 参数(简化版)
如果仅用于临时测试,不需要长期稳定运行,可以给SSH命令添加-f参数让其在后台执行,脚本内只需给每个命令加&:
修改后的脚本:
#!/bin/bash sudo python3 /home/proj1/webServer.py & sudo python3 /home/proj2/server/main.py & sudo python3 /home/proj1/test/test_server.py & sudo python3 /home/proj2/process_receiving_images.py &
执行命令:
ssh -f root@MachineB 'bash -s' < init_all_processes.sh
注意:这种方式下,若SSH会话异常终止,后台进程可能会被系统回收,适合短期场景。
方案3:使用setsid脱离会话
setsid可以让进程完全脱离当前终端会话,效果类似nohup:
#!/bin/bash sudo setsid python3 /home/proj1/webServer.py >/dev/null 2>&1 & sudo setsid python3 /home/proj2/server/main.py >/dev/null 2>&1 & # 其余命令同理
传递参数的实现
如果需要向远程脚本传递参数,可以在SSH命令中通过--传递,脚本内用位置变量接收:
例如要给webServer.py传递--port 8080参数:
执行命令:
ssh root@MachineB 'bash -s' -- --port 8080 < init_all_processes.sh
修改脚本:
#!/bin/bash sudo nohup python3 /home/proj1/webServer.py "$@" >/dev/null 2>&1 & # "$@"会接收所有传递的参数,按需分配给其他脚本 sudo nohup python3 /home/proj2/server/main.py >/dev/null 2>&1 &
内容的提问来源于stack exchange,提问作者M.K
相关产品推荐
相关产品推荐

