如果shell脚本执行失败,如何实现重试机制?

时间:2013-12-29 08:18:12

标签: python bash shell subprocess

我正在尝试在Python代码中执行shell脚本。到目前为止,一切看起来都不错。

下面是我将执行shell脚本的Python脚本。现在举个例子,这里是一个简单的Hello World shell脚本。

jsonStr = '{"script":"#!/bin/bash\\necho Hello world 1\\n"}'
j = json.loads(jsonStr)

shell_script = j['script']

print "start"
proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
   print "Shell script gave some error"
   print stderr
else:
   print stdout
   print "end" # Shell script ran fine.

现在我正在寻找的是,无论出于何种原因,无论何时我从Python代码执行我的shell脚本,并且无论出于什么原因它都失败了。那意味着stderr将不会为空。所以现在我想再次重试执行shell脚本,假设在睡眠几毫秒之后呢?

如果shell脚本执行失败,意味着是否有可能实现重试机制?我可以重试5到6次吗?意思是可以配置这个号码吗?

3 个答案:

答案 0 :(得分:5)

from time import sleep
MAX_TRIES = 6

# ... your other code ...

for i in xrange(MAX_TRIES):
    proc = subprocess.Popen(shell_script, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdout, stderr) = proc.communicate()
    if stderr:
       print "Shell script gave some error..."
       print stderr
       sleep(0.05) # delay for 50 ms
    else:
       print stdout
       print "end" # Shell script ran fine.
       break

答案 1 :(得分:0)

这样的事情可能是:

maxRetries = 6
retries = 0

while (retries < maxRetries):
    doSomething ()
    if errorCondition:
        retries += 1
        continue
    break

答案 2 :(得分:0)

使用装饰器怎么样?似乎是一种非常明确的方式。 你可以在这里阅读https://wiki.python.org/moin/PythonDecoratorLibrary。 (重试装饰者)