#!/usr/bin/env python
import sys
import json
import gearman
from fabric import *
from fabric.api import *
from gearman import GearmanWorker
#
# Run the ssh task
#
def exe_job(worker, job):
d = json.loads(job.data)
env.host_string = d['host']
cmd = d['command']
retries = int(d['retries'])
output = ""
# Run the fabric command. Do not abort on exit
# Run job for the given number of retries
tmp_retries = retries;
while retries > 0:
with settings(warn_only=True):
result = run(cmd)
output = output + str(result)
if result.failed:
if retries == 1:
job.send_fail()
break
else:
next
else:
break
retries = retries - 1
return output
#
# Main function
#
def main():
gm_worker = gearman.GearmanWorker(['localhost:4730'])
gm_worker.register_task('exe_job',exe_job)
gm_worker.work()
if __name__ == '__main__':
main()
私のコードでは、ユーザーが指定した再試行回数のギアマンジョブ(ファブリックコマンドを実行)を再試行しようとしています。試行ごとに、私はキャプチャして出力を追加しています。最後の再試行で、ジョブが失敗した場合、出力をクライアントに戻したいと思います。gearman workerから失敗したジョブ出力を送信する最善の方法は何ですか?
何が起きているかは、job.send_fail()コマンドが単に中断し、失敗したコマンドの出力を返すために "return output"コマンドにまったく移動しないということです。
ジョブが失敗し、終了時または失敗時にクライアントにデータを返す良い方法はありますか?