def msg_curse(self, args=None): """Return the dict to display in the curse interface.""" # Init the return message ret = [] # Only process if stats exist and display plugin enable... if self.stats == [] or args.disable_process: return ret # Compute the sort key if glances_processes.getmanualsortkey() is None: process_sort_key = glances_processes.getautosortkey() else: process_sort_key = glances_processes.getmanualsortkey() sort_style = 'SORT' # Header msg = '{0:>6}'.format(_("CPU%")) ret.append( self.curse_add_line( msg, sort_style if process_sort_key == 'cpu_percent' else 'DEFAULT')) msg = '{0:>6}'.format(_("MEM%")) ret.append( self.curse_add_line( msg, sort_style if process_sort_key == 'memory_percent' else 'DEFAULT')) msg = '{0:>6}'.format(_("VIRT")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("RES")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("PID")) ret.append(self.curse_add_line(msg)) msg = ' {0:10}'.format(_("USER")) ret.append(self.curse_add_line(msg)) msg = '{0:>4}'.format(_("NI")) ret.append(self.curse_add_line(msg)) msg = '{0:>2}'.format(_("S")) ret.append(self.curse_add_line(msg)) msg = '{0:>9}'.format(_("TIME+")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("IOR/s")) ret.append( self.curse_add_line( msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) msg = '{0:>6}'.format(_("IOW/s")) ret.append( self.curse_add_line( msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) msg = ' {0:8}'.format(_("Command")) ret.append(self.curse_add_line(msg)) # Trying to display proc time tag_proc_time = True # Loop over processes (sorted by the sort key previously compute) first = True for p in self.sortlist(process_sort_key): ret.append(self.curse_new_line()) # CPU if 'cpu_percent' in p and p[ 'cpu_percent'] is not None and p['cpu_percent'] != '': msg = '{0:>6.1f}'.format(p['cpu_percent']) ret.append( self.curse_add_line( msg, self.get_alert(p['cpu_percent'], header="cpu"))) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) # MEM if 'memory_percent' in p and p['memory_percent'] is not None and p[ 'memory_percent'] != '': msg = '{0:>6.1f}'.format(p['memory_percent']) ret.append( self.curse_add_line( msg, self.get_alert(p['memory_percent'], header="mem"))) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) # VMS/RSS if 'memory_info' in p and p[ 'memory_info'] is not None and p['memory_info'] != '': # VMS msg = '{0:>6}'.format( self.auto_unit(p['memory_info'][1], low_precision=False)) ret.append(self.curse_add_line(msg, optional=True)) # RSS msg = '{0:>6}'.format( self.auto_unit(p['memory_info'][0], low_precision=False)) ret.append(self.curse_add_line(msg, optional=True)) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) ret.append(self.curse_add_line(msg)) # PID msg = '{0:>6}'.format(p['pid']) ret.append(self.curse_add_line(msg)) # USER if 'username' in p: # docker internal users are displayed as ints only, therefore str() msg = ' {0:9}'.format(str(p['username'])[:9]) ret.append(self.curse_add_line(msg)) else: msg = ' {0:9}'.format('?') ret.append(self.curse_add_line(msg)) # NICE if 'nice' in p: nice = p['nice'] if nice is None: nice = '?' msg = '{0:>5}'.format(nice) if isinstance(nice, int) and ((is_windows and nice != 32) or (not is_windows and nice != 0)): ret.append(self.curse_add_line(msg, decoration='NICE')) else: ret.append(self.curse_add_line(msg)) else: msg = '{0:>5}'.format('?') ret.append(self.curse_add_line(msg)) # STATUS if 'status' in p: status = p['status'] msg = '{0:>2}'.format(status) if status == 'R': ret.append(self.curse_add_line(msg, decoration='STATUS')) else: ret.append(self.curse_add_line(msg)) else: msg = '{0:>2}'.format('?') ret.append(self.curse_add_line(msg)) # TIME+ if tag_proc_time: try: dtime = timedelta(seconds=sum(p['cpu_times'])) except Exception: # Catched on some Amazon EC2 server # See https://github.com/nicolargo/glances/issues/87 tag_proc_time = False else: msg = '{0}:{1}.{2}'.format( str(dtime.seconds // 60 % 60), str(dtime.seconds % 60).zfill(2), str(dtime.microseconds)[:2].zfill(2)) else: msg = ' ' msg = '{0:>9}'.format(msg) ret.append(self.curse_add_line(msg, optional=True)) # IO read/write if 'io_counters' in p: # IO read io_rs = (p['io_counters'][0] - p['io_counters'][2]) / p['time_since_update'] if io_rs == 0: msg = '{0:>6}'.format("0") else: msg = '{0:>6}'.format( self.auto_unit(io_rs, low_precision=False)) ret.append( self.curse_add_line(msg, optional=True, additional=True)) # IO write io_ws = (p['io_counters'][1] - p['io_counters'][3]) / p['time_since_update'] if io_ws == 0: msg = '{0:>6}'.format("0") else: msg = '{0:>6}'.format( self.auto_unit(io_ws, low_precision=False)) ret.append( self.curse_add_line(msg, optional=True, additional=True)) else: msg = '{0:>6}'.format("?") ret.append( self.curse_add_line(msg, optional=True, additional=True)) ret.append( self.curse_add_line(msg, optional=True, additional=True)) # Command line # If no command line for the process is available, fallback to # the bare process name instead cmdline = p['cmdline'] if cmdline == "" or args.process_short_name: msg = ' {0}'.format(p['name']) ret.append(self.curse_add_line(msg, splittable=True)) else: try: cmd = cmdline.split()[0] argument = ' '.join(cmdline.split()[1:]) path, basename = os.path.split(cmd) if os.path.isdir(path): msg = ' {0}'.format(path) + os.sep ret.append(self.curse_add_line(msg, splittable=True)) ret.append( self.curse_add_line(basename, decoration='PROCESS', splittable=True)) else: msg = ' {0}'.format(basename) ret.append( self.curse_add_line(msg, decoration='PROCESS', splittable=True)) msg = " {0}".format(argument) ret.append(self.curse_add_line(msg, splittable=True)) except UnicodeEncodeError: ret.append(self.curse_add_line("", splittable=True)) # Add extended stats but only for the top processes # !!! CPU consumption ??? # TODO: extended stats into the web interface if first and 'extended_stats' in p: # Left padding xpad = ' ' * 13 # First line is CPU affinity if 'cpu_affinity' in p and p['cpu_affinity'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('CPU affinity: ') + str( len(p['cpu_affinity'])) + _(' cores') ret.append(self.curse_add_line(msg, splittable=True)) # Second line is memory info if 'memory_info_ex' in p and p['memory_info_ex'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('Memory info: ') for k, v in p['memory_info_ex']._asdict().items(): # Ignore rss and vms (already displayed) if k not in ['rss', 'vms'] and v is not None: msg += k + ' ' + self.auto_unit( v, low_precision=False) + ' ' if 'memory_swap' in p and p['memory_swap'] is not None: msg += _('swap ') + self.auto_unit(p['memory_swap'], low_precision=False) ret.append(self.curse_add_line(msg, splittable=True)) # Third line is for openned files/network sessions ret.append(self.curse_new_line()) msg = xpad + _('Openned: ') if 'num_threads' in p and p['num_threads'] is not None: msg += _('threads ') + str(p['num_threads']) + ' ' if 'num_fds' in p and p['num_fds'] is not None: msg += _('files ') + str(p['num_fds']) + ' ' if 'num_handles' in p and p['num_handles'] is not None: msg += _('handles ') + str(p['num_handles']) + ' ' if 'tcp' in p and p['tcp'] is not None: msg += _('TCP ') + str(p['tcp']) + ' ' if 'udp' in p and p['udp'] is not None: msg += _('UDP ') + str(p['udp']) + ' ' ret.append(self.curse_add_line(msg, splittable=True)) # Fouth line is IO nice level (only Linux and Windows OS) if 'ionice' in p and p['ionice'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('IO nice: ') k = _('Class is ') v = p['ionice'].ioclass # Linux: The scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle. # Windows: On Windows only ioclass is used and it can be set to 2 (normal), 1 (low) or 0 (very low). if is_windows: if v == 0: msg += k + 'Very Low' elif v == 1: msg += k + 'Low' elif v == 2: msg += _('No specific I/O priority') else: msg += k + str(v) else: if v == 0: msg += _('No specific I/O priority') elif v == 1: msg += k + 'Real Time' elif v == 2: msg += k + 'Best Effort' elif v == 3: msg += k + 'IDLE' else: msg += k + str(v) # value is a number which goes from 0 to 7. # The higher the value, the lower the I/O priority of the process. if hasattr(p['ionice'], 'value') and p['ionice'].value != 0: msg += _(' (value %s/7)') % str(p['ionice'].value) ret.append(self.curse_add_line(msg, splittable=True)) # End of extended stats first = False # Return the message with decoration return ret
def msg_curse(self, args=None): """Return the dict to display in the curse interface.""" # Init the return message ret = [] # Only process if stats exist and display plugin enable... if args.disable_process: msg = _("PROCESSES DISABLED (press 'z' to display)") ret.append(self.curse_add_line(msg)) return ret if self.stats == {}: return ret # Display the filter (if it exists) if glances_processes.get_process_filter() is not None: msg = _("Processes filter:") ret.append(self.curse_add_line(msg, "TITLE")) msg = _(" {0} ").format(glances_processes.get_process_filter()) ret.append(self.curse_add_line(msg, "FILTER")) msg = _("(press ENTER to edit)") ret.append(self.curse_add_line(msg)) ret.append(self.curse_new_line()) # Build the string message # Header msg = _("TASKS ") ret.append(self.curse_add_line(msg, "TITLE")) # Compute processes other = self.stats['total'] msg = str(self.stats['total']) ret.append(self.curse_add_line(msg)) if 'thread' in self.stats: msg = _(" ({0} thr),").format(self.stats['thread']) ret.append(self.curse_add_line(msg)) if 'running' in self.stats: other -= self.stats['running'] msg = _(" {0} run,").format(self.stats['running']) ret.append(self.curse_add_line(msg)) if 'sleeping' in self.stats: other -= self.stats['sleeping'] msg = _(" {0} slp,").format(self.stats['sleeping']) ret.append(self.curse_add_line(msg)) msg = _(" {0} oth ").format(other) ret.append(self.curse_add_line(msg)) # Display sort information if glances_processes.getmanualsortkey() is None: msg = _("sorted automatically") ret.append(self.curse_add_line(msg)) msg = _(" by {0}").format(glances_processes.getautosortkey()) ret.append(self.curse_add_line(msg)) else: msg = _("sorted by {0}").format(glances_processes.getmanualsortkey()) ret.append(self.curse_add_line(msg)) # Return the message with decoration return ret
def msg_curse(self, args=None): """Return the dict to display in the curse interface.""" # Init the return message ret = [] # Only process if stats exist and display plugin enable... if args.disable_process: msg = _("PROCESSES DISABLED (press 'z' to display)") ret.append(self.curse_add_line(msg)) return ret if self.stats == {}: return ret # Display the filter (if it exists) if glances_processes.get_process_filter() is not None: msg = _("Processes filter:") ret.append(self.curse_add_line(msg, "TITLE")) msg = _(" {0} ").format(glances_processes.get_process_filter()) ret.append(self.curse_add_line(msg, "FILTER")) msg = _("(press ENTER to edit)") ret.append(self.curse_add_line(msg)) ret.append(self.curse_new_line()) # Build the string message # Header msg = _("TASKS ") ret.append(self.curse_add_line(msg, "TITLE")) # Compute processes other = self.stats['total'] msg = str(self.stats['total']) ret.append(self.curse_add_line(msg)) if 'thread' in self.stats: msg = _(" ({0} thr),").format(self.stats['thread']) ret.append(self.curse_add_line(msg)) if 'running' in self.stats: other -= self.stats['running'] msg = _(" {0} run,").format(self.stats['running']) ret.append(self.curse_add_line(msg)) if 'sleeping' in self.stats: other -= self.stats['sleeping'] msg = _(" {0} slp,").format(self.stats['sleeping']) ret.append(self.curse_add_line(msg)) msg = _(" {0} oth ").format(other) ret.append(self.curse_add_line(msg)) # Display sort information if glances_processes.getmanualsortkey() is None: msg = _("sorted automatically") ret.append(self.curse_add_line(msg)) msg = _(" by {0}").format(glances_processes.getautosortkey()) ret.append(self.curse_add_line(msg)) else: msg = _("sorted by {0}").format( glances_processes.getmanualsortkey()) ret.append(self.curse_add_line(msg)) # Return the message with decoration return ret
def msg_curse(self, args=None): """Return the dict to display in the curse interface.""" # Init the return message ret = [] # Only process if stats exist and display plugin enable... if self.stats == [] or args.disable_process: return ret # Compute the sort key if glances_processes.getmanualsortkey() is None: process_sort_key = glances_processes.getautosortkey() else: process_sort_key = glances_processes.getmanualsortkey() sort_style = 'SORT' # Header msg = '{0:>6}'.format(_("CPU%")) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'cpu_percent' else 'DEFAULT')) msg = '{0:>6}'.format(_("MEM%")) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'memory_percent' else 'DEFAULT')) msg = '{0:>6}'.format(_("VIRT")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("RES")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("PID")) ret.append(self.curse_add_line(msg)) msg = ' {0:10}'.format(_("USER")) ret.append(self.curse_add_line(msg)) msg = '{0:>4}'.format(_("NI")) ret.append(self.curse_add_line(msg)) msg = '{0:>2}'.format(_("S")) ret.append(self.curse_add_line(msg)) msg = '{0:>9}'.format(_("TIME+")) ret.append(self.curse_add_line(msg, optional=True)) msg = '{0:>6}'.format(_("IOR/s")) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) msg = '{0:>6}'.format(_("IOW/s")) ret.append(self.curse_add_line(msg, sort_style if process_sort_key == 'io_counters' else 'DEFAULT', optional=True, additional=True)) msg = ' {0:8}'.format(_("Command")) ret.append(self.curse_add_line(msg)) # Trying to display proc time tag_proc_time = True # Loop over processes (sorted by the sort key previously compute) first = True for p in self.sortlist(process_sort_key): ret.append(self.curse_new_line()) # CPU if 'cpu_percent' in p and p['cpu_percent'] is not None and p['cpu_percent'] != '': msg = '{0:>6.1f}'.format(p['cpu_percent']) ret.append(self.curse_add_line(msg, self.get_alert(p['cpu_percent'], header="cpu"))) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) # MEM if 'memory_percent' in p and p['memory_percent'] is not None and p['memory_percent'] != '': msg = '{0:>6.1f}'.format(p['memory_percent']) ret.append(self.curse_add_line(msg, self.get_alert(p['memory_percent'], header="mem"))) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) # VMS/RSS if 'memory_info' in p and p['memory_info'] is not None and p['memory_info'] != '': # VMS msg = '{0:>6}'.format(self.auto_unit(p['memory_info'][1], low_precision=False)) ret.append(self.curse_add_line(msg, optional=True)) # RSS msg = '{0:>6}'.format(self.auto_unit(p['memory_info'][0], low_precision=False)) ret.append(self.curse_add_line(msg, optional=True)) else: msg = '{0:>6}'.format('?') ret.append(self.curse_add_line(msg)) ret.append(self.curse_add_line(msg)) # PID msg = '{0:>6}'.format(p['pid']) ret.append(self.curse_add_line(msg)) # USER if 'username' in p: # docker internal users are displayed as ints only, therefore str() msg = ' {0:9}'.format(str(p['username'])[:9]) ret.append(self.curse_add_line(msg)) else: msg = ' {0:9}'.format('?') ret.append(self.curse_add_line(msg)) # NICE if 'nice' in p: nice = p['nice'] if nice is None: nice = '?' msg = '{0:>5}'.format(nice) if isinstance(nice, int) and ((is_windows and nice != 32) or (not is_windows and nice != 0)): ret.append(self.curse_add_line(msg, decoration='NICE')) else: ret.append(self.curse_add_line(msg)) else: msg = '{0:>5}'.format('?') ret.append(self.curse_add_line(msg)) # STATUS if 'status' in p: status = p['status'] msg = '{0:>2}'.format(status) if status == 'R': ret.append(self.curse_add_line(msg, decoration='STATUS')) else: ret.append(self.curse_add_line(msg)) else: msg = '{0:>2}'.format('?') ret.append(self.curse_add_line(msg)) # TIME+ if tag_proc_time: try: dtime = timedelta(seconds=sum(p['cpu_times'])) except Exception: # Catched on some Amazon EC2 server # See https://github.com/nicolargo/glances/issues/87 tag_proc_time = False else: msg = '{0}:{1}.{2}'.format(str(dtime.seconds // 60 % 60), str(dtime.seconds % 60).zfill(2), str(dtime.microseconds)[:2].zfill(2)) else: msg = ' ' msg = '{0:>9}'.format(msg) ret.append(self.curse_add_line(msg, optional=True)) # IO read/write if 'io_counters' in p: # IO read io_rs = (p['io_counters'][0] - p['io_counters'][2]) / p['time_since_update'] if io_rs == 0: msg = '{0:>6}'.format("0") else: msg = '{0:>6}'.format(self.auto_unit(io_rs, low_precision=False)) ret.append(self.curse_add_line(msg, optional=True, additional=True)) # IO write io_ws = (p['io_counters'][1] - p['io_counters'][3]) / p['time_since_update'] if io_ws == 0: msg = '{0:>6}'.format("0") else: msg = '{0:>6}'.format(self.auto_unit(io_ws, low_precision=False)) ret.append(self.curse_add_line(msg, optional=True, additional=True)) else: msg = '{0:>6}'.format("?") ret.append(self.curse_add_line(msg, optional=True, additional=True)) ret.append(self.curse_add_line(msg, optional=True, additional=True)) # Command line # If no command line for the process is available, fallback to # the bare process name instead cmdline = p['cmdline'] if cmdline == "" or args.process_short_name: msg = ' {0}'.format(p['name']) ret.append(self.curse_add_line(msg, splittable=True)) else: try: cmd = cmdline.split()[0] argument = ' '.join(cmdline.split()[1:]) path, basename = os.path.split(cmd) if os.path.isdir(path): msg = ' {0}'.format(path) + os.sep ret.append(self.curse_add_line(msg, splittable=True)) ret.append(self.curse_add_line(basename, decoration='PROCESS', splittable=True)) else: msg = ' {0}'.format(basename) ret.append(self.curse_add_line(msg, decoration='PROCESS', splittable=True)) msg = " {0}".format(argument) ret.append(self.curse_add_line(msg, splittable=True)) except UnicodeEncodeError: ret.append(self.curse_add_line("", splittable=True)) # Add extended stats but only for the top processes # !!! CPU consumption ??? # TODO: extended stats into the web interface if first and 'extended_stats' in p: # Left padding xpad = ' ' * 13 # First line is CPU affinity if 'cpu_affinity' in p and p['cpu_affinity'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('CPU affinity: ') + str(len(p['cpu_affinity'])) + _(' cores') ret.append(self.curse_add_line(msg, splittable=True)) # Second line is memory info if 'memory_info_ex' in p and p['memory_info_ex'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('Memory info: ') for k, v in p['memory_info_ex']._asdict().items(): # Ignore rss and vms (already displayed) if k not in ['rss', 'vms'] and v is not None: msg += k + ' ' + self.auto_unit(v, low_precision=False) + ' ' if 'memory_swap' in p and p['memory_swap'] is not None: msg += _('swap ') + self.auto_unit(p['memory_swap'], low_precision=False) ret.append(self.curse_add_line(msg, splittable=True)) # Third line is for openned files/network sessions ret.append(self.curse_new_line()) msg = xpad + _('Openned: ') if 'num_threads' in p and p['num_threads'] is not None: msg += _('threads ') + str(p['num_threads']) + ' ' if 'num_fds' in p and p['num_fds'] is not None: msg += _('files ') + str(p['num_fds']) + ' ' if 'num_handles' in p and p['num_handles'] is not None: msg += _('handles ') + str(p['num_handles']) + ' ' if 'tcp' in p and p['tcp'] is not None: msg += _('TCP ') + str(p['tcp']) + ' ' if 'udp' in p and p['udp'] is not None: msg += _('UDP ') + str(p['udp']) + ' ' ret.append(self.curse_add_line(msg, splittable=True)) # Fouth line is IO nice level (only Linux and Windows OS) if 'ionice' in p and p['ionice'] is not None: ret.append(self.curse_new_line()) msg = xpad + _('IO nice: ') k = _('Class is ') v = p['ionice'].ioclass # Linux: The scheduling class. 0 for none, 1 for real time, 2 for best-effort, 3 for idle. # Windows: On Windows only ioclass is used and it can be set to 2 (normal), 1 (low) or 0 (very low). if is_windows: if v == 0: msg += k + 'Very Low' elif v == 1: msg += k + 'Low' elif v == 2: msg += _('No specific I/O priority') else: msg += k + str(v) else: if v == 0: msg += _('No specific I/O priority') elif v == 1: msg += k + 'Real Time' elif v == 2: msg += k + 'Best Effort' elif v == 3: msg += k + 'IDLE' else: msg += k + str(v) # value is a number which goes from 0 to 7. # The higher the value, the lower the I/O priority of the process. if hasattr(p['ionice'], 'value') and p['ionice'].value != 0: msg += _(' (value %s/7)') % str(p['ionice'].value) ret.append(self.curse_add_line(msg, splittable=True)) # End of extended stats first = False # Return the message with decoration return ret