#!/usr/bin/python3 import os import re import sys def usage(): sys.stderr.write('{}: [-s searchstring] [-S searchstring] [-l lines] [-q]\n'.format(sys.argv[0])) sys.stderr.write('\n') sys.stderr.write('Search for matches, and allow the user to select the appropriate pid in a convenenient manner\n') sys.stderr.write('\n') sys.stderr.write('-s searchstring\tSearch for processes matching "searchstring", prompting if finding only one match\n') sys.stderr.write('-S searchstring\tSearch for processes matching "searchstring", not prompting if finding only one match\n') sys.stderr.write('-l lines\terror out if there are more than "lines" lines that match\n') sys.stderr.write('-q\tbe quiet\n') sys.exit(1) search='' one_ok = False quiet = False lines=24 if 'LINES' in os.environ: lines = int(os.environ['LINES']) while sys.argv[1:]: if sys.argv[2:] and sys.argv[1] == '-s': one_ok = False search = sys.argv[2] del sys.argv[1] del sys.argv[1] elif sys.argv[2:] and sys.argv[1] == '-S': one_ok = True search = sys.argv[2] del sys.argv[1] del sys.argv[1] elif sys.argv[2:] and sys.argv[1] == '-l': lines = int(sys.argv[2]) del sys.argv[1] del sys.argv[1] elif sys.argv[1] == '-q': quiet = True del sys.argv[1] else: sys.stderr.write('sys.argv[1] is {}\n'.format(sys.argv[1])) usage() if not search: usage() def get_ps(): processes = os.popen("ps -eo pid,args",'r').readlines() if not processes[0:]: processes = os.popen("process-list2",'r').readlines() return processes infile = open('/dev/tty','r') outfile = open('/dev/tty','w') processes = get_ps() hits=[] regex = re.compile(search) for line in processes: if regex.search(line) is not None and line.find(sys.argv[0]) == -1: hits.append(line) length = len(hits) if length == 0: sys.stderr.write('{}: Sorry, no matches on {} found\n'.format(sys.argv[0], search)) sys.stderr.flush() sys.exit(1) elif one_ok and length == 1: if not quiet: sys.stderr.write('{}: Single match found: "{}"\n'.format(sys.argv[0], hits[0].strip())) sys.stderr.flush() fields = hits[0].strip().split() print(fields[0]) else: if length > lines: sys.stderr.write('{}: Sorry, too many matches: {}\n'.format(sys.argv[0], length)) sys.stderr.flush() sys.exit(1) # multiple hits on the search string for i in range(length): outfile.write("{}) {}".format(i, hits[i])) outfile.flush() while True: outfile.write('\nEnter number corresponding to process: ') outfile.flush() ind = int(infile.readline().strip()) if ind < 0 or ind > lines-1: outfile.write('Sorry, {} is not between 0 and {}\n'.format(ind, lines)) else: break fields = hits[ind].split() print(fields[0])