comparison mxtool/mx.py @ 14134:e71d421370f3

mx: proxy SIGQUIT to child process useful to get a jstack like output
author Bernhard Urban <bernhard.urban@jku.at>
date Tue, 11 Mar 2014 18:36:49 +0100
parents d2e4b81fd8f0
children ee66410c0679
comparison
equal deleted inserted replaced
14133:d2e4b81fd8f0 14134:e71d421370f3
1090 return _java 1090 return _java
1091 1091
1092 def run_java(args, nonZeroIsFatal=True, out=None, err=None, cwd=None, addDefaultArgs=True): 1092 def run_java(args, nonZeroIsFatal=True, out=None, err=None, cwd=None, addDefaultArgs=True):
1093 return run(java().format_cmd(args, addDefaultArgs), nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd) 1093 return run(java().format_cmd(args, addDefaultArgs), nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd)
1094 1094
1095 def _kill_process_group(pid): 1095 def _kill_process_group(pid, sig=signal.SIGKILL):
1096 pgid = os.getpgid(pid) 1096 pgid = os.getpgid(pid)
1097 try: 1097 try:
1098 os.killpg(pgid, signal.SIGKILL) 1098 os.killpg(pgid, sig)
1099 return True 1099 return True
1100 except: 1100 except:
1101 log('Error killing subprocess ' + str(pgid) + ': ' + str(sys.exc_info()[1])) 1101 log('Error killing subprocess ' + str(pgid) + ': ' + str(sys.exc_info()[1]))
1102 return False 1102 return False
1103 1103
1461 result = expandvars(value) 1461 result = expandvars(value)
1462 if '$' in result or '%' in result: 1462 if '$' in result or '%' in result:
1463 abort('Property contains an undefined environment variable: ' + value) 1463 abort('Property contains an undefined environment variable: ' + value)
1464 return result 1464 return result
1465 1465
1466
1467 def quit_handler(signum, frame):
1468 p, _ = _currentSubprocess
1469 if p is not None:
1470 if get_os() == 'windows':
1471 log("mx: implement me! want to send SIGQUIT to my child process")
1472 else:
1473 _kill_process_group(p.pid, sig=signal.SIGQUIT)
1474 time.sleep(0.1)
1466 1475
1467 def abort(codeOrMessage): 1476 def abort(codeOrMessage):
1468 """ 1477 """
1469 Aborts the program with a SystemExit exception. 1478 Aborts the program with a SystemExit exception.
1470 If 'codeOrMessage' is a plain integer, it specifies the system exit status; 1479 If 'codeOrMessage' is a plain integer, it specifies the system exit status;
4064 4073
4065 c, _ = _commands[command][:2] 4074 c, _ = _commands[command][:2]
4066 def term_handler(signum, frame): 4075 def term_handler(signum, frame):
4067 abort(1) 4076 abort(1)
4068 signal.signal(signal.SIGTERM, term_handler) 4077 signal.signal(signal.SIGTERM, term_handler)
4078
4079 signal.signal(signal.SIGQUIT, quit_handler)
4080
4069 try: 4081 try:
4070 if opts.timeout != 0: 4082 if opts.timeout != 0:
4071 def alarm_handler(signum, frame): 4083 def alarm_handler(signum, frame):
4072 abort('Command timed out after ' + str(opts.timeout) + ' seconds: ' + ' '.join(commandAndArgs)) 4084 abort('Command timed out after ' + str(opts.timeout) + ' seconds: ' + ' '.join(commandAndArgs))
4073 signal.signal(signal.SIGALRM, alarm_handler) 4085 signal.signal(signal.SIGALRM, alarm_handler)