qwatch.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/usr/bin/env python
  2. import sys, os, signal, subprocess, shlex, time, atexit
  3. shutdown = False
  4. queue_process = None
  5. def file_pid(name):
  6. proc1 = subprocess.Popen(shlex.split('ps aux'), stdout=subprocess.PIPE)
  7. proc2 = subprocess.Popen(shlex.split('grep ' + name), stdin=proc1.stdout, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  8. proc3 = subprocess.Popen(shlex.split('awk \'{print $2}\' '), stdin=proc2.stdout, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  9. proc1.stdout.close()
  10. proc2.stdout.close()
  11. out, err = proc3.communicate()
  12. lines = out.splitlines()
  13. pids = []
  14. for line in lines:
  15. item = line.strip()
  16. pid = int(item)
  17. if pid > 0:
  18. pids.append(pid)
  19. if len(pids) > 0:
  20. return pids
  21. else:
  22. return []
  23. def kill_pid(name):
  24. print("kill_pid " + name)
  25. cur_pid = os.getpid()
  26. pids = file_pid(name)
  27. for pid in pids:
  28. try:
  29. if cur_pid != pid:
  30. os.kill(pid, signal.SIGKILL)
  31. print('kill pid=' + str(pid))
  32. else:
  33. continue
  34. except OSError as e:
  35. pass
  36. except BaseException as be:
  37. pass
  38. return
  39. def sig_handler(sig, frame):
  40. global shutdown
  41. global queue_process
  42. frame = None
  43. if sig == signal.SIGINT:
  44. shutdown = True
  45. elif sig == signal.SIGTERM:
  46. shutdown = True
  47. if shutdown == True and queue_process != None:
  48. for proc in queue_process:
  49. proc.terminate()
  50. class Daemon(object):
  51. def __init__(self, input='/dev/null', output='/tmp/qwatch.out'):
  52. self.infile = input
  53. self.outfile = output
  54. def register_handler(self):
  55. signal.signal(signal.SIGINT, sig_handler)
  56. signal.signal(signal.SIGTERM, sig_handler)
  57. signal.signal(signal.SIGCHLD, sig_handler)
  58. def daemonize(self):
  59. try:
  60. pid = os.fork()
  61. if pid != 0:
  62. sys.exit(0)
  63. except OSError as e:
  64. sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
  65. sys.exit(1)
  66. os.setsid()
  67. os.umask(0)
  68. try:
  69. pid = os.fork()
  70. if pid != 0:
  71. sys.exit(0)
  72. except OSError as e:
  73. sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
  74. sys.exit(1)
  75. os.close(0)
  76. os.close(1)
  77. os.close(2)
  78. os.open(self.infile, os.O_RDONLY)
  79. os.open(self.outfile, os.O_WRONLY | os.O_APPEND | os.O_CREAT)
  80. os.dup(1)
  81. print("********************************************************")
  82. def mac_sys():
  83. plat_name = sys.platform
  84. return plat_name == 'darwin'
  85. def main():
  86. global queue_process
  87. kill_pid("qwatch.py")
  88. kill_pid("crontab.php")
  89. queue_process = list()
  90. d = Daemon()
  91. d.daemonize()
  92. d.register_handler()
  93. print("cur_pid =" + str(os.getpid()))
  94. if mac_sys():
  95. cmds = ["php", "./crontab.php", "queue", "index"]
  96. proc_num = 1
  97. else:
  98. cmds = ["/usr/local/php/bin/php", "./crontab.php", "queue", "index"]
  99. proc_num = 10
  100. for i in range(0, proc_num):
  101. subproc = subprocess.Popen(cmds, close_fds=True, stdin=None, stdout=None, stderr=None)
  102. queue_process.append(subproc)
  103. print("create queue process pid=" + str(subproc.pid))
  104. while shutdown == False:
  105. time.sleep(1)
  106. for process in queue_process:
  107. if process.poll() is not None:
  108. print (str(process.pid) + " is dead.")
  109. queue_process.remove(process)
  110. child = subprocess.Popen(cmds, close_fds=True, stdin=None, stdout=None, stderr=None)
  111. print("create queue process pid=" + str(child.pid))
  112. queue_process.append(child)
  113. if __name__ == '__main__':
  114. main()