#!/usr/bin/env python3 # proc2log: new processes monitor import os from time import sleep period = 0.01 # получение чистого пид сета def foo(): proc_list = os.listdir('/proc') proc_set = set() for i in proc_list: if i.isdigit() != True: continue proc_set.add(i) return proc_set # имя через пид def pid_to_name(pid): try: with open('/proc/' + pid + '/status') as f: for line in f: return line[:-1].split('\t')[1] except FileNotFoundError: return '[ UNKNOWN ]' # печать одного пида и имени def print_pid(pid): try: with open('/proc/' + pid + '/status') as f: for lineno, line in enumerate(f): name = line[:-1].split('\t')[1] print('+ {}, {}'.format(pid, name)) pid_dict[pid] = name if lineno >= 0: break except FileNotFoundError: name = pid_dict.pop(pid, '[ UNKNOWN ]') print(' - {}, {}'.format(pid, name)) except ProcessLookupError: name = pid_dict.pop(pid, '[ UNKNOWN ]') print(' - {}, {}'.format(pid, name)) # нахождение и печать дельт сетов def delta(old_set): new_set = set(os.listdir('/proc')) plus = new_set - old_set minus = old_set - new_set if len(plus) > 0: for pid in plus: print_pid(pid) if len(minus) > 0: for pid in minus: print_pid(pid) return new_set print('proc2log started') print('+ PID, NAME - PID, NAME') # первичное наполнение словаря значениями pid:name для печати имён исчезнувших процессов pid_dict = dict() for pid in foo(): pid_dict[pid] = pid_to_name(pid) pid_set = set(os.listdir('/proc')) while True: pid_set = delta(pid_set) sleep(period)