#!/usr/bin/env python3 # notify_low_mem --mem '14% 12%' --name 'stress' --pid '6666' # output: # Low memory: 14% 12% # Fattest process: 6666, stress from argparse import ArgumentParser from subprocess import Popen, PIPE parser = ArgumentParser() parser.add_argument( '--mem', help="""available memory percent (15%, for example)""", default=None, type=str ) parser.add_argument( '--pid', help="""pid""", default=None, type=str ) parser.add_argument( '--name', help="""process name""", default=None, type=str ) args = parser.parse_args() pid = args.pid name = args.name mem = args.mem title = 'Low memory: {}'.format(mem) body = 'Fattest process: {}, {}'.format(pid, name) # return list of tuples with # username, DISPLAY and DBUS_SESSION_BUS_ADDRESS def root_notify_env(): ps_output_list = Popen(['ps', 'ae'], stdout=PIPE ).communicate()[0].decode().split('\n') lines_with_displays = [] for line in ps_output_list: if ' DISPLAY=' in line and ' DBUS_SESSION_BUS_ADDRES' \ 'S=' in line and ' USER=' in line: lines_with_displays.append(line) # list of tuples with needments deus = [] for i in lines_with_displays: for i in i.split(' '): if i.startswith('USER='): user = i.strip('\n').split('=')[1] continue if i.startswith('DISPLAY='): disp_value = i.strip('\n').split('=')[1][0:2] disp = 'DISPLAY=' + disp_value continue if i.startswith('DBUS_SESSION_BUS_ADDRESS='): dbus = i.strip('\n') deus.append(tuple([user, disp, dbus])) # unique list of tuples vult = [] for user_env_tuple in set(deus): vult.append(user_env_tuple) return vult b = root_notify_env() if len(b) > 0: for i in b: username, display_env, dbus_env = i[0], i[1], i[2] Popen(['sudo', '-u', username, 'env', display_env, dbus_env, 'notify-send', '--icon=dialog-warning', '{}'.format(title), '{}'.format(body)])