【发布时间】:2016-08-31 16:17:54
【问题描述】:
我的目标很简单:启动 rsync 并且不要等待。
Debian 上的 Python 2.7.9
示例代码:
rsync_cmd = "/usr/bin/rsync -a -e 'ssh -i /home/myuser/.ssh/id_rsa' {0}@{1}:'{2}' {3}".format(remote_user, remote_server, file1, file1)
rsync_cmd2 = "/usr/bin/rsync -a -e 'ssh -i /home/myuser/.ssh/id_rsa' {0}@{1}:'{2}' {3} &".format(remote_user, remote_server, file1, file1)
rsync_path = "/usr/bin/rsync"
rsync_args = shlex.split("-a -e 'ssh -i /home/mysuser/.ssh/id_rsa' {0}@{1}:'{2}' {3}".format(remote_user, remote_server, file1, file1))
#subprocess.call(rsync_cmd, shell=True) # This isn't supposed to work but I tried it
#subprocess.Popen(rsync_cmd, shell=True) # This is supposed to be the solution but not for me
#subprocess.Popen(rsync_cmd2, shell=True) # Adding my own shell "&" to background it, still fails
#subprocess.Popen(rsync_cmd, shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) # This doesn't work
#subprocess.Popen(shlex.split(rsync_cmd)) # This doesn't work
#os.execv(rsync_path, rsync_args) # This doesn't work
#os.spawnv(os.P_NOWAIT, rsync_path, rsync_args) # This doesn't work
#os.system(rsync_cmd2) # This doesn't work
print "DONE"
(我注释掉执行命令只是因为我实际上将所有的试验都保存在我的代码中,以便我知道我做了什么和没有做什么。显然,我会运行脚本右行未注释。)
这是怎么回事...我可以在服务器上观看传输,当传输完成时,我会在屏幕上打印“DONE”。
我希望在发出rsync 命令并开始传输后立即打印“DONE”。
看起来很直接。我遵循了其他帖子中概述的详细信息,例如 this 一个和 this 一个,但有些东西阻止了它为我工作。
提前谢谢。
(我已经尝试了在 StackExchange 中可以找到的所有内容,但我不觉得这是重复的,因为我仍然无法让它工作。我的设置有问题,需要帮助。)
【问题讨论】:
-
似乎问题已得到解答here
-
@viach 的指针是你最好的选择。
-
This one 说“creationflags”仅适用于 Windows。您提供的链接也谈到了 Win32。
-
您是否尝试过简化代码以查看问题所在?
subprocess.call("sleep 10".split())在代码中有明显的延迟,而subprocess.Popen("sleep 10".split())立即进入下一行。也许您的问题在其他地方并且很难看到?如果您将 rsync 调用更改为简单的睡眠调用,您的代码是否工作(在时间方面)? -
不相关:提及 "NOTHING that works for me" 是 无用,除非您显示失败的确切代码示例,请描述您做了什么期望它会发生什么,而不是一步一步地发生。
标签: python subprocess background-process popen