使用子流程延迟执行命令

fre*_*rik 2 python

我正在尝试使用子进程从python脚本执行以下命令: sleep 10 && sudo /etc/init.d/tractor-blade restart &

我希望python脚本完成(返回代码0)。然后,十秒钟后,我希望命令能够被执行。

这就是我所拥有的:

import sys, subprocess
command = ['sleep', '10', '&&', 'sudo', '/etc/init.d/tractor-blade', 'restart' '&']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

# Catch stdout
sys.stdout.flush()
for line in iter(p.stdout.readline, b''):
    print(">>> " + line.rstrip())
Run Code Online (Sandbox Code Playgroud)

但这是发生了什么:

>>> sleep: invalid time interval `&&'
>>> sleep: invalid time interval `sudo'
>>> sleep: invalid time interval `/etc/init.d/tractor-blade'
>>> sleep: invalid time interval `restart'
>>> sleep: invalid time interval `&'
>>> Try `sleep --help' for more information.
Run Code Online (Sandbox Code Playgroud)

我猜我的格式有误吗?

在执行命令之前,我需要使python脚本完整,这就是为什么我尝试向命令添加延迟的原因。我的sudoers允许使用NOPASSWD执行此“拖拉机铲刀”,因此不需要密码。

zmo*_*zmo 5

这是因为子fork()进程可以在两种模式下工作:或者是由作为参数传递的元组指定的进程,或者是使用Shell执行字符串。不同之处在于shell论点。因此,您可能想做的是:

command = "sleep 10 && sudo /etc/init.d/tractor-blade restart"
p = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)

要么:

time.sleep(10)
command = ['sudo', '/etc/init.d/tractor-blade', 'restart' '&']
subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)

文档中

shell参数(默认为False)指定是否将shell用作要执行的程序。如果shell为True,建议将args作为字符串而不是序列传递。