gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:57 25 4
gpt4 key购买 nike

我正在尝试使用这个answer使用 subprocess.Popen 使用 nohup 发出一个长时间运行的进程,然后退出连接。

从登录 shell 中,如果我运行

$ nohup sleep 20 &
$ exit

我得到了预期的行为,即我可以在 sleep 进程仍在运行时注销,并稍后重新连接以检查其状态。然而,如果我尝试通过 Python 执行相同的操作,则似乎 exit 命令在 sleep 时间结束之前不会执行。

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()

我错过了什么?

最佳答案

来自文档:Python Docs

Warning Use communicate() rather than .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

好吧,我现在明白了:

关于communicate():[...]等待进程终止所以我想你之前的解决方案更好。但是,如果您在最后调用它,这应该不是问题,或者如果您不需要 stdin 或 stderr 作为输出,则根本不调用它

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

关于python - 使用 Python 的 Popen 通过 SSH 运行 nohup 命令,然后注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42507164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com