在python的后台运行“linux”睡眠

时间:2013-11-19 13:00:03

标签: python linux bash execute

我有一个python脚本,它应该执行一个shell脚本。但它应该在执行前睡30秒。我希望脚本在后台睡眠然后执行它。

Shell命令应该是这样的: 如果我直接在控制台上输入此命令,则可以正常工作。

(sleep 30 && /root/bin/myscript.sh parameter1 parameter2) > /dev/null 2>&1

现在来自python :(我已将命令分开)

subprocess.call(['/bin/sleep', '30', '&'])
subprocess.call(['/root/bin/myscript.sh', str(dom), str(limit), '&'])

(str(dom)和str(limit)是2个参数)

我收到此错误:

/bin/sleep: invalid time interval `&'

为什么&作为参数而不是30?

4 个答案:

答案 0 :(得分:3)

错误是因为&作为参数传递给/bin/sleep命令,而您在告诉shell在后台执行命令的上下文中使用它。

如果您想使用'&'或'&&'你可以使用os.system

os.system('sleep 1 && echo foo && sleep 5 && echo bar')

或要运行非阻止(在后台)您可以使用标准&

os.system('sleep 1 && echo foo && sleep 5 && echo bar &')

答案 1 :(得分:1)

你无法做你想做的事情,强迫python脚本每次都在后台运行。 Python也无法直接在后台运行任务。您可以查看Threading,这可能会达到您想要的效果,但不知道为什么要返回命令提示符,这很困难。我认为你可能想要的是一个专门的线程计时器,可以找到一个例子here

from threading import Timer

def hello():
    print "hello, world"

t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed

答案 2 :(得分:1)

使用一个字符串调用:

prc = subprocess.Popen('/bin/sleep 3; echo Some string', shell=True)

注意,我删除&

答案 3 :(得分:1)

怎么样

subprocess.Popen(["sh","-c","sleep 30; /root/bin/myscript.sh parameter1 parameter2"])

您可以使用字符串连接为parameter1,parameter2构建命令行。

但正如PearsonArtPhoto的回答所述,使用线程是更好的选择。