使用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
相关产品推荐
相关产品推荐

