【问题标题】:run a "linux" sleep in background from python从python在后台运行“linux”睡眠
【发布时间】:2013-12-03 01:06:36
【问题描述】:

我有一个 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?

【问题讨论】:

  • 你为什么不直接使用time.sleep(secs)docs.python.org/2/library/time.html#time.sleep
  • 我想回到控制台,不要等待 20 秒,直到脚本执行完毕。
  • 在后台调用sleep 只会导致myscript.shsleep 并行运行,而不是在sleep 之后运行。多次调用subprocess.call 不会将它们启动的进程排队。

标签: python linux bash execute


【解决方案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

【讨论】:

  • 我不想在后台运行 python 脚本。只有 2 个 shell 命令 :)
【解决方案2】:

错误是因为 & 被作为参数传递给 /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 &')

【讨论】:

  • 是的,这行得通 :) 现在,我只需要实现参数 str(dom) 和 str(limit)。喜欢os.system('sleep 20 && /root/bin/myscript.sh str(dom) str(limit) &') 当然不是字符串:D
  • 如果您使用不受信任的用户提供的字符串(例如来自网络服务器),请小心,否则您可能容易受到 shell 注入。
  • 这是一个内部服务器。而python脚本来自xen;)我用os.system('/bin/sleep 20 && /root/bin/myscript.sh %s %s &' % (str(dom), str(limit)))尝试过错误:sh: Syntax error: "&" unexpected
  • 这很奇怪,&ing os.system 命令对我有用。这是什么环境?
  • Debian 6.0.4 与 Xen。 Python 2.7.2+ 正在运行。但是使用您的示例命令,它可以工作。 :S
【解决方案3】:

用一个字符串调用:

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

注意,我删除了&

【讨论】:

  • subprocess.Popen 在后台运行并且不阻塞主要的 Pythjon 进程。查看更新。
  • 是的,你修好了 :-)
【解决方案4】:

怎么样

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

您可以使用字符串连接为参数1、参数2构建命令行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2023-03-18
    • 2023-03-23
    • 2014-06-03
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多