You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用paramiko调用远程服务器script.py执行后不终止任务继续运行的问题

解决方案

问题原因

  • paramiko的exec_command默认会同步等待远程命令执行完成才会返回,所以你的后续逻辑要等脚本跑完才会执行
  • 就算你提前断开SSH连接,没有做脱离会话处理的远程命令会被系统发送挂断信号强制终止,导致脚本提前结束

修复方法

第一步:修改远程执行命令,让脚本后台脱离会话运行

把你的command变量替换为:
command = "nohup python3 script.py > /dev/null 2>&1 &"
各部分作用说明:

  • nohup:让命令忽略SSH会话断开时的挂断信号,保证会话关闭后脚本还能继续运行
  • > /dev/null 2>&1:把脚本的标准输出、标准错误都重定向到空设备,避免输出缓冲区占满导致脚本卡住,如果你需要留存日志,可以把/dev/null替换为指定的日志文件路径,比如/home/your_user/script.log
  • 末尾的&:让命令在远程后台执行,执行后shell会立刻返回,不会阻塞等待脚本运行结束

第二步:调整本地代码逻辑

修改后的完整代码参考:

import paramiko

command = "nohup python3 script.py > /dev/null 2>&1 &"

client = paramiko.SSHClient() 
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(ip, port, user, password)

# 执行命令,因为命令是后台运行,exec_command会立刻返回
stdin, stdout, stderr = client.exec_command(command)
# 读取命令返回的状态,确认后台启动成功,不会阻塞
exit_status = stdout.channel.recv_exit_status()
if exit_status == 0:
    print("远程脚本已后台启动")
else:
    print("脚本启动失败,错误信息:", stderr.read().decode())

# 不需要等待脚本执行完成,直接执行后续逻辑
while True:
    # do something
    pass

# 后续可以正常关闭client,不会影响远程脚本运行
client.close()

注意事项

  • 如果需要后续查看远程脚本是否还在运行,可以手动登录远程机器执行ps aux | grep "script.py"查询对应进程
  • 如果脚本需要访问本地终端相关的资源,需要额外调整运行参数,常规后台运行任务用上面的命令即可

内容的提问来源于stack exchange,提问作者ohad avraham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:15:03