我目前有一个主python脚本,它可以在远程主机上启动6个作业,并轮询这些作业是否在很长一段时间内完成(通常是几天(。但是,在下面的代码中,self.job_results列表中的第一个元素始终是"sh:1:mv:未找到"。但是,6 个作业值始终在该列表中(例如,列表中有 7 个元素,应该只有 6 个(。似乎rq.job.Job
正在返回此值;知道为什么吗?
hosts = HOSTS.keys()
job_ids = []
for host in hosts:
r = requests.get(HOSTS[host] + 'launch_jobs', auth=('admin', 'secret'))
job_ids.append(r.text)
host_job_dict = dict(zip(hosts, job_ids))
print "HOST_JOB_DICT: %s " % host_job_dict
launch_time = datetime.datetime.now()
self.job_result = []
complete = False
status = [False]*len(hosts)
host_job_keys = host_job_dict.keys()
while not complete:
check_time = datetime.datetime.now()
time_diff = check_time - launch_time
if time_diff.seconds > JOB_TIMEOUT:
sys.exit('Job polling has lasted 10 days, something is wrong')
print "HOST_JOB_KEYS %s " % host_job_keys
for idx, key in enumerate(host_job_keys):
if not status[idx]:
host = HOSTS[key]
j_id = host_job_dict[key]
req = requests.get(host + 'check_job/' + j_id, auth=('admin', 'secret'))
if req.status_code == 202:
continue
elif req.status_code == 200:
self.job_result.append(req.json()['results'].encode('ascii').split())
status[idx] = True
complete = all(status)
time.sleep(1)
在服务器端...
@app.route("/check_job/<job_key>", methods=['GET'])
@requires_auth
def check_job(job_key):
job = Job.fetch(job_key, connection=conn)
if job.is_finished:
data = job.return_value
json_data = jsonify({"results": data})
# return Response(response=json_data, status=200, mimetype="application/json")
return json_data
elif job.status == 'failed':
return "Failed", 202
else:
return "Not yet", 202
事实证明,这是一个
非常复杂的问题,无法识别/bin
中的mv
和其他命令。为了解决这个问题,我们只是明确地使用了/bin/mv
。我们认为这个问题是由于 systemctl 实例化的复杂性而出现的