我正在尝试使用此answer使用subprocess.Popen
使用nohup发出长时间运行的进程,然后退出连接。
从登录shell,如果我运行
$ nohup sleep 20 &
$ exit
我得到了预期的行为,即我可以在睡眠过程仍在运行时注销,稍后再连接以检查其状态。但是,如果我通过Python尝试相同的操作,似乎exit
命令在休眠时间结束之前不会执行。
import subprocess
HOST=<host>
sshProcess = subprocess.Popen(['ssh', HOST],
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
universal_newlines = True,
bufsize = 0)
sshProcess.stdin.write("nohup sleep 20 &\n")
sshProcess.stdin.write("exit\n")
sshProcess.stdin.close()
我错过了什么?
答案 0 :(得分:1)
来自文档:Python Docs
警告使用communic()而不是.stdin.write,.stdout.read或.stderr.read来避免因任何其他OS管道缓冲区填满和阻止子进程而导致的死锁。
好吧我很确定我现在得到了它:
关于communication():[...]等待进程终止 所以我想你早期的解决方案更好。但是如果你最后打电话给它,如果不是问题,或者如果你不需要stdin或stderr作为输出那就根本不打电话
但是根据这个:StackOverflow Comment如果你在Popen调用中设置preexec_fn = os.setpgrp它应该可以工作。