我在通过 ssh 从 python 脚本运行未完成的进程时遇到问题。我需要做什么:
- 通过 ssh 连接到远程服务器
- 在此服务器上运行 mongod
- 完成脚本执行而不终止 mongod 进程
目前,我以这种方式使用 subprocess.Popen
:
subprocess.Popen(['ssh', 'user@' + host, 'mongod', '-f', '/temp-mongo.conf', '&'])
问题是脚本在我被询问用户密码之前结束,因此它以root 身份验证失败次数过多
结束。
我尝试使用p = subprocess.Popen(...).communicate()
,它几乎没问题,但是脚本等待mongod
命令结束了,显然不会发生什么。
执行此操作的正确方法是什么?我可以做一些事情来自动传递密码吗?
最佳答案
我同意 e4c5 的观点,您应该使用像 Fabric
这样的工具。如果你想继续使用肮脏的方式,这样的事情应该有效:
subprocess.call('ssh user@%s "mongod -f /temp-mongo.conf &>/dev/null &"' % host,
shell=True)
请注意,您需要执行以下操作:
- 引用远程调用
- add
&>/dev/null
将 mongod 的所有输出路由到/dev/null (如果没有这个,它会阻塞,不能 100% 确定原因。可能是因为附加了 shell 的标准输出到命令) - 使用
shell=True
以便 shell 为您构建命令(这样您就不需要用", "
代替每个空格)<
这也适用于通过公钥进行身份验证(而不是手动编写密码)
关于Python 脚本通过 ssh 连接、运行进程并断开连接,无需等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41630144/