jobs.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import sh
  4. import sys
  5. import signal
  6. import Queue
  7. def run_job(sema, child_q, manager_q, provider):
  8. aquired = False
  9. def before_quit(*args):
  10. provider.terminate()
  11. if aquired:
  12. print("{} release semaphore".format(provider.name))
  13. sema.release()
  14. sys.exit(0)
  15. signal.signal(signal.SIGTERM, before_quit)
  16. while 1:
  17. try:
  18. sema.acquire(True)
  19. except:
  20. break
  21. aquired = True
  22. print("start syncing {}".format(provider.name))
  23. for hook in provider.hooks:
  24. hook.before_job()
  25. provider.run()
  26. try:
  27. provider.wait()
  28. except sh.ErrorReturnCode:
  29. status = "fail"
  30. else:
  31. status = "success"
  32. for hook in provider.hooks[::-1]:
  33. try:
  34. hook.after_job(name=provider.name, status=status)
  35. except Exception:
  36. import traceback
  37. traceback.print_exc()
  38. sema.release()
  39. aquired = False
  40. print("syncing {} finished, sleep {} minutes for the next turn".format(
  41. provider.name, provider.interval
  42. ))
  43. try:
  44. msg = child_q.get(timeout=provider.interval * 60)
  45. if msg == "terminate":
  46. manager_q.put((provider.name, "QUIT"))
  47. break
  48. except Queue.Empty:
  49. pass
  50. # vim: ts=4 sw=4 sts=4 expandtab