我正在编写一些代码,这些代码将通过 SSH DD block 设备,我想用子进程执行此操作,以便我可以在传输期间监视 DD 的状态(使用 SIGUSR1 杀死 dd 进程以获得它的当前状态,并使用选择读取它)。
我要执行的命令是这样的:
dd if=/dev/sda | ssh root@example.com 'dd of=/dev/sda'
我目前尝试的方法是:
dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE)
ssh_process = subprocess.Popen(['ssh','root@example.com','dd of=/dev/sda'],0,None,dd_process.stdout)
但是,当我运行它时,SSH 进程会在 10-40 秒后失效。
我在这里是完全迟钝了,还是没有办法像这样在子流程之间进行管道传输?
编辑:原来我的真实代码中没有主机名。这才是正确的做事方式。
最佳答案
from subprocess import Popen, PIPE
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE)
ssh_process = Popen(['ssh', 'root@example.com', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE)
dd_process.stdout.close() # enable write error in dd if ssh dies
out, err = ssh_process.communicate()
这是将第一个过程输出通过管道传递给第二个过程的方法。 (注意 ssh_process 中的标准输入)
关于两个子进程之间的 Python 管道输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846891/