113 lines
2.6 KiB
Python
113 lines
2.6 KiB
Python
import subprocess
|
|
import requests
|
|
import sys
|
|
import io
|
|
import copy
|
|
import traceback
|
|
import datetime
|
|
import pprint
|
|
import logging
|
|
import json
|
|
import time
|
|
|
|
with io.open(
|
|
'tmp/d1/cpanel.json', 'r'
|
|
) as f:
|
|
t3 = json.load(f)
|
|
|
|
t2 = copy.deepcopy(t3)
|
|
for k in t2:
|
|
v = t2[k]
|
|
v['task'] = lambda : subprocess.Popen(
|
|
v['task_cmd'],
|
|
stdin=subprocess.DEVNULL,
|
|
)
|
|
|
|
def stop_task(task):
|
|
task.terminate()
|
|
try:
|
|
task.wait(1)
|
|
except:
|
|
task.kill()
|
|
|
|
t1 = dict()
|
|
|
|
shutdown = False
|
|
|
|
while True:
|
|
try:
|
|
for k, v in t2.items():
|
|
if not k in t1:
|
|
logging.info(json.dumps(dict(
|
|
task=k,
|
|
status='starting',
|
|
)))
|
|
t1[k] = v['task']()
|
|
logging.info(json.dumps(dict(
|
|
task=k,
|
|
status='started',
|
|
)))
|
|
continue
|
|
|
|
o = t1[k]
|
|
|
|
not_alive = None
|
|
|
|
try:
|
|
not_alive = not (
|
|
requests.get(v['url'], timeout=0.5).status_code
|
|
== 200
|
|
)
|
|
except:
|
|
logging.error(json.dumps(dict(
|
|
error=traceback.format_exc(),
|
|
time_iso=datetime.datetime.now().isoformat(),
|
|
)))
|
|
not_alive = True
|
|
|
|
if not_alive:
|
|
logging.error(json.dumps(
|
|
dict(
|
|
args=o.args,
|
|
k=k,
|
|
#o=pprint.pformat(o.__dict__),
|
|
status='not_alive',
|
|
time_iso=datetime.datetime.now().isoformat(),
|
|
)
|
|
))
|
|
|
|
#stop_task(o)
|
|
#del t1[k]
|
|
continue
|
|
|
|
if not o.poll() is None:
|
|
logging.error(json.dumps(
|
|
dict(
|
|
#o=pprint.pformat(o.__dict__),
|
|
args=o.args,
|
|
k=k,
|
|
return_code=o.poll(),
|
|
status='crashed',
|
|
time_iso=datetime.datetime.now().isoformat(),
|
|
)
|
|
))
|
|
del t1[k]
|
|
continue
|
|
|
|
if shutdown:
|
|
break
|
|
|
|
print('\r%s tasks %d' % (
|
|
datetime.datetime.now().isoformat(),
|
|
len(t1),
|
|
), end='')
|
|
sys.stdout.flush()
|
|
except KeyboardInterrupt:
|
|
print('\nshutting down')
|
|
break
|
|
finally:
|
|
time.sleep(5 * 60)
|
|
|
|
for o in t1:
|
|
stop_task(o)
|