使用Python的Popen通过SSH运行nohup命令然后注销

时间:2017-02-28 11:10:52

标签: python ssh subprocess nohup

我正在尝试使用此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()

我错过了什么?

1 个答案:

答案 0 :(得分:1)

来自文档:Python Docs

  

警告使用communic()而不是.stdin.write,.stdout.read或.stderr.read来避免因任何其他OS管道缓冲区填满和阻止子进程而导致的死锁。

好吧我很确定我现在得到了它:

关于communication():[...]等待进程终止 所以我想你早期的解决方案更好。但是如果你最后打电话给它,如果不是问题,或者如果你不需要stdin或stderr作为输出那就根本不打电话

但是根据这个:StackOverflow Comment如果你在Popen调用中设置preexec_fn = os.setpgrp它应该可以工作。