diff --git a/simrunner/config_processing.py b/simrunner/config_processing.py index 253e5b85a19fac2d46411fcb5b1701d19242bc48..7a712eb65d2bc8d2b68e773a3e6045e7b443e162 100644 --- a/simrunner/config_processing.py +++ b/simrunner/config_processing.py @@ -4,10 +4,10 @@ import json import os # List of byte sizes for the events little one for testing -BYTE_SIZES = ['16', '32', '64', '128', '256', '512', '1024', '2048', '4096', '8192', - '16384', '32768', '65536', '131072', '262144', '524288', '1048576', '2097152', - '4194304', '8388608', '16777216', '33554432', '67108864'] -#BYTE_SIZES = ['16', '32', '64', '128'] +#BYTE_SIZES = ['16', '32', '64', '128', '256', '512', '1024', '2048', '4096', '8192', + #'16384', '32768', '65536', '131072', '262144', '524288', '1048576', '2097152', + #'4194304', '8388608', '16777216', '33554432', '67108864'] +BYTE_SIZES = ['16', '32'] # Function to parse command-line arguments @@ -26,7 +26,7 @@ def parse_arguments(): help='Choose function to execute default: various') parser.add_argument('-d', '--data', type=str, default=main_directory, help='Folder to store the date for visualizer default: ./') - parser.add_argument('-p', '--protokoll', type=str, default=main_directory, + parser.add_argument('-p', '--testData', type=str, default=main_directory, help='Folder to store the test data from detector sim default: ./') return parser.parse_args() diff --git a/simrunner/data_config.json b/simrunner/data_config.json index 2ceb79447973ade54212cf5452991851e60b9250..44b03d1f8c34a4e91e26de3652fdb168a4bc4b7f 100644 --- a/simrunner/data_config.json +++ b/simrunner/data_config.json @@ -12,7 +12,7 @@ "note": "this is only a help an it is never used by the simrunner programm", "--burstInterval": "event interval in a burst default: 1000000", "--burstLength": "number of events in a burst default: 0", - "-d, --dataGenerator": "name of the data generator default: random", + "--dataGenerator": "name of the data generator default: random", "--debugOptions": "give debug output to option parsing default: false", "-h, --help": "give this help default: false", "-i, --interval": "event interval default: 1000000000", @@ -20,7 +20,7 @@ "--noCfgFileRecursion": "do not read config files recursively, must be set before use default: false", "--noCfgFiles": "do not read the default config files, must be FIRST option default: false", "--nodeId": "nodeId for object indentification default:", - "-p, --prefixData": "data prepended to output lines default:", + "--prefixData": "data prepended to output lines default:", "-s, --size": "block size (only needed by long)", "--skew": "timing skew between threads, fracton of interval default: 0", "--startTime": "time point to start generating data default: -9223372036.854776", diff --git a/simrunner/main.py b/simrunner/main.py index 8689dbb569c83008f74dd1b2123ef4328ebad83a..b198dc93f1e50254e63b6ac822adeffcf1253e64 100644 --- a/simrunner/main.py +++ b/simrunner/main.py @@ -1,5 +1,6 @@ import os import time +import signal import subprocess import logging import concurrent.futures as cf @@ -10,14 +11,19 @@ import config_processing as con # Set up logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) +stop_requested = False # Function to print terminal output and handle errors def terminal_output(output, errors, return_code): - logger.info(output) - logger.info(errors) if return_code > 0: - logger.info(f'return code: {return_code}') + logger.error(f'return code: {return_code}') + if errors: + logger.error(errors) + if output: + logger.info(output) + else: + logger.info(output) # Function to pull data from remote machines to the local machine @@ -33,17 +39,35 @@ def rm_data(t_data_path): if args.hosts: host = args.hosts[0] ssh_target = f'{args.user}@{host}' - rm_cmd = f'ssh {ssh_target} rm -f {t_data_path}/*' + rm_cmd = f'ssh {ssh_target} rm -r {t_data_path}' subprocess.run(rm_cmd, shell=True, check=True) +def handle_sigint(signum, frame): + logger.info("Main process received KeyboardInterrupt") + global stop_requested + stop_requested = True + for h in args.hosts: + kill_target = f'{args.user}@{h}' + kill_cmd = f"ssh {kill_target} pkill -f {args.sim}" + re = subprocess.run(kill_cmd, shell=True) + ou = re.stdout + er = re.stderr + logger.info(f'{ou} {er}') + logger.info(f'{kill_target} killed') + + # Function to run the detector simulation with the given event arguments def run_sim(e_dict, d_path, sim_path, main_path): with cf.ThreadPoolExecutor() as executor: + signal.signal(signal.SIGINT, handle_sigint) for event in e_dict: + if stop_requested: + break futures = [] folder_name = e_dict[event]['-o'] e_dict[event]['--startTime'] = f'@{int(time.time() + 10)}' + e_dict[event]['--posixDataDir'] = os.path.join(e_dict[event]['--posixDataDir'], event) output_path = os.path.join(d_path, folder_name) if args and args.hosts: # Remote execution on multiple machines with specified user @@ -60,13 +84,13 @@ def run_sim(e_dict, d_path, sim_path, main_path): for folder_name, host, future in futures: output, errors, result = future.result() terminal_output(output, errors, result) - if host: - stat_file_name = f'statistics_{folder_name}_{host}' - else: - stat_file_name = f'statistics_{folder_name}_lokal' - op.write_statistics(main_path, stat_file_name, output) + if output: + if host: + stat_file_name = f'statistics_{folder_name}_{host}' + else: + stat_file_name = f'statistics_{folder_name}_lokal' + op.write_statistics(main_path, stat_file_name, output) logger.info(f'{folder_name}_{host if host else ""} done!') - rm_data(test_data_path) # --- MAIN --- @@ -81,11 +105,14 @@ if __name__ == '__main__': test_data_path = os.path.join(args.data, 'test_data') # Setup arguments for Sim - #event_dict = con.create_event_list(args, test_data_path) + event_dict = con.create_event_list(args, test_data_path) # Run detectorSimulation - #run_sim(event_dict, data_path, simulation_path, main_folder_path) + + run_sim(event_dict, data_path, simulation_path, main_folder_path) pull_data(data_path, main_folder_path) + rm_data(test_data_path) + diff --git a/simrunner/simulation.py b/simrunner/simulation.py index 7485a20007b5f8ec15aeee555a0db3dfa30cff1a..a01bfc766fef31073727faf617dc1747653d4723 100644 --- a/simrunner/simulation.py +++ b/simrunner/simulation.py @@ -1,3 +1,4 @@ + import subprocess import output_processing as op