From 28dec3510d0b1ddd63d1291d80952f737db5c992 Mon Sep 17 00:00:00 2001 From: Kun Huang Date: Sat, 14 Nov 2015 21:49:52 +0800 Subject: [PATCH] use signal.signal to handle SIGINT Change-Id: I49962eb2caa92170df6d758b40c53f35cc3c54bb --- scalpels/cmd/tracer.py | 55 +++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/scalpels/cmd/tracer.py b/scalpels/cmd/tracer.py index 1a1ac6e..c272c73 100644 --- a/scalpels/cmd/tracer.py +++ b/scalpels/cmd/tracer.py @@ -20,34 +20,33 @@ TODO: config key-word arguments for each tracer """ +worker_pid = None +task_uuid = None +out = None +ag = None + def read_from_ag(ag): # wrong impl. here, need read from config or db instead from scalpels.client.utils import tracers_map as agents_map data_dir = db_api.setup_config_get()["data_dir"].rstrip("/") return agents_map.get(ag) % data_dir -def main(): - task_uuid, ag = sys.argv[1], sys.argv[2] - cmd = read_from_ag(ag) - print "[LOG] running CMD: %s" % cmd - - worker = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) - out = [] - try: - while True: - t = worker.stdout.readline() - if not len(t): - break - _t = (time.time(), t.strip()) - out.append(_t) - except KeyboardInterrupt: - print "[LOG] %s is interupted" % ag +def handle_int(signal, frame): + print "[LOG] xxx is interupted" + stop_tracer() + save_result_to_task() + sys.exit(0) +def stop_tracer(): + global worker_pid # psutil is much more professional... I have to use it instead # this kill is to script process - worker_p = psutil.Process(worker.pid) + worker_p = psutil.Process(worker_pid) worker_p.send_signal(signal.SIGINT) +def save_result_to_task(): + global task_uuid + global out parse_func = getattr(base, "parse_%s" % ag) # TODO file lock is okay in localhost, here need redis for distributed @@ -67,5 +66,27 @@ def main(): time.sleep(2) co.stop() +def main(): + global worker_pid + global task_uuid + global out + global ag + signal.signal(signal.SIGINT, handle_int) + task_uuid, ag = sys.argv[1], sys.argv[2] + out = [] + cmd = read_from_ag(ag) + print "[LOG] running CMD: %s" % cmd + + worker = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) + worker_pid = worker.pid + while True: + t = worker.stdout.readline() + if not len(t): + break + _t = (time.time(), t.strip()) + out.append(_t) + + + if __name__ == "__main__": main()