#!/usr/bin/env python import sys, os, signal, subprocess, shlex, time, atexit shutdown = False queue_process = None def file_pid(name): proc1 = subprocess.Popen(shlex.split('ps aux'), stdout=subprocess.PIPE) proc2 = subprocess.Popen(shlex.split('grep ' + name), stdin=proc1.stdout, stdout=subprocess.PIPE,stderr=subprocess.PIPE) proc3 = subprocess.Popen(shlex.split('awk \'{print $2}\' '), stdin=proc2.stdout, stdout=subprocess.PIPE,stderr=subprocess.PIPE) proc1.stdout.close() proc2.stdout.close() out, err = proc3.communicate() lines = out.splitlines() pids = [] for line in lines: item = line.strip() pid = int(item) if pid > 0: pids.append(pid) if len(pids) > 0: return pids else: return [] def kill_pid(name): print("kill_pid " + name) cur_pid = os.getpid() pids = file_pid(name) for pid in pids: try: if cur_pid != pid: os.kill(pid, signal.SIGKILL) print('kill pid=' + str(pid)) else: continue except OSError as e: pass except BaseException as be: pass return def sig_handler(sig, frame): global shutdown global queue_process frame = None if sig == signal.SIGINT: shutdown = True elif sig == signal.SIGTERM: shutdown = True if shutdown == True and queue_process != None: for proc in queue_process: proc.terminate() class Daemon(object): def __init__(self, input='/dev/null', output='/tmp/qwatch.out'): self.infile = input self.outfile = output def register_handler(self): signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGCHLD, sig_handler) def daemonize(self): try: pid = os.fork() if pid != 0: sys.exit(0) except OSError as e: sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) os.setsid() os.umask(0) try: pid = os.fork() if pid != 0: sys.exit(0) except OSError as e: sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) os.close(0) os.close(1) os.close(2) os.open(self.infile, os.O_RDONLY) os.open(self.outfile, os.O_WRONLY | os.O_APPEND | os.O_CREAT) os.dup(1) print("********************************************************") def mac_sys(): plat_name = sys.platform return plat_name == 'darwin' def main(): global queue_process kill_pid("qwatch.py") kill_pid("crontab.php") queue_process = list() d = Daemon() d.daemonize() d.register_handler() print("cur_pid =" + str(os.getpid())) if mac_sys(): cmds = ["php", "./crontab.php", "queue", "index"] proc_num = 1 else: cmds = ["/usr/local/php/bin/php", "./crontab.php", "queue", "index"] proc_num = 10 for i in range(0, proc_num): subproc = subprocess.Popen(cmds, close_fds=True, stdin=None, stdout=None, stderr=None) queue_process.append(subproc) print("create queue process pid=" + str(subproc.pid)) while shutdown == False: time.sleep(1) for process in queue_process: if process.poll() is not None: print (str(process.pid) + " is dead.") queue_process.remove(process) child = subprocess.Popen(cmds, close_fds=True, stdin=None, stdout=None, stderr=None) print("create queue process pid=" + str(child.pid)) queue_process.append(child) if __name__ == '__main__': main()