+
+def __checkUnkilledProcesses():
+ '''
+ Check all unkilled SALOME processes (internal).
+ :return: list of unkilled processes
+ '''
+ def _checkUserName(_process):
+ # The following is a workaround for Windows on which
+ # psutil.Process().username() returns 'usergroup' + 'username'
+ return getUserName() == _process.username().split('\\')[-1]
+
+ def _getDictfromOutput(_processes, _wildcard=None):
+ for _process in psutil.process_iter(['name', 'username']):
+ with suppress(psutil.AccessDenied):
+ if _checkUserName(_process) and re.match(_wildcard, _process.info['name']):
+ _processes.append(_process)
+
+ processes = list()
+ _getDictfromOutput(processes, '(SALOME_*)')
+ _getDictfromOutput(processes, '(omniNames)')
+ _getDictfromOutput(processes, '(ghs3d)')
+ _getDictfromOutput(processes, '(ompi-server)')
+
+ return processes
+
+def killUnkilledProcesses():
+ """
+ Kill processes which could remain even after shutdowning SALOME sessions.
+ """
+ __killProcesses(__checkUnkilledProcesses())
+
+def main():
+ '''
+ Main function
+ '''
+ from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
+ formatter = lambda prog: ArgumentDefaultsHelpFormatter(prog, max_help_position=50, width=120)
+ parser = ArgumentParser(description='Forcibly stop given SALOME session(s)',
+ formatter_class=formatter)
+ parser.add_argument('ports',
+ help='ports to kill',
+ nargs='*', type=int)
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument('-s', '--spy',
+ help='start daemon to watch PID and then kill given PORT',
+ nargs=2, type=int, metavar=('PID', 'PORT'))
+ group.add_argument('-l', '--list',
+ help='list unkilled SALOME processes',
+ action='store_true')
+ args = parser.parse_args()
+
+ if args.ports and (args.spy or args.list):
+ print("{}: error: argument ports cannot be used with -s/--spy or -l/--list"
+ .format(parser.prog), file=sys.stderr)