mirror of
https://github.com/nicolargo/glances.git
synced 2024-12-29 04:04:03 +03:00
Merge branch 'release/v2.1.1'
This commit is contained in:
commit
287af37541
15
NEWS
15
NEWS
@ -2,6 +2,21 @@
|
|||||||
Glances Version 2.x
|
Glances Version 2.x
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
Version 2.1.1
|
||||||
|
=============
|
||||||
|
|
||||||
|
Enhancement:
|
||||||
|
* Automaticaly compute top processes number for the current screen (issue #408)
|
||||||
|
* CPU and Memory footprint optimization (issue #401)
|
||||||
|
|
||||||
|
Bugs corrected:
|
||||||
|
|
||||||
|
* Mac OS X 10.9: Exception at start (issue #423)
|
||||||
|
* Process no longer exists (issue #421)
|
||||||
|
* Error with Glances Client with Python 3.4.1 (issue #419)
|
||||||
|
* TypeError: memory_maps() takes exactly 2 arguments (issue #413)
|
||||||
|
* No filesystem informations since Glances 2.0 bug enhancement (issue #381)
|
||||||
|
|
||||||
Version 2.1
|
Version 2.1
|
||||||
===========
|
===========
|
||||||
|
|
||||||
|
@ -96,10 +96,6 @@ core 0_alias=CPU Core 0
|
|||||||
core 1_alias=CPU Core 1
|
core 1_alias=CPU Core 1
|
||||||
|
|
||||||
[processlist]
|
[processlist]
|
||||||
# Maximum number of processes to show in the UI
|
|
||||||
# Note: Only limit number of showed processes (not the one returned by the API)
|
|
||||||
# Default is 20 processes (Top 20)
|
|
||||||
max_processes=20
|
|
||||||
# Limit values for CPU/MEM per process in %
|
# Limit values for CPU/MEM per process in %
|
||||||
# Default values if not defined: 50/70/90
|
# Default values if not defined: 50/70/90
|
||||||
cpu_careful=50
|
cpu_careful=50
|
||||||
|
@ -96,10 +96,6 @@ battery_critical=95
|
|||||||
#core 1_alias=CPU Core 1
|
#core 1_alias=CPU Core 1
|
||||||
|
|
||||||
[processlist]
|
[processlist]
|
||||||
# Maximum number of processes to show in the UI
|
|
||||||
# Note: Only limit number of showed processes (not the one returned by the API)
|
|
||||||
# Default is 20 processes (Top 20)
|
|
||||||
max_processes=20
|
|
||||||
# Limit values for CPU/MEM per process in %
|
# Limit values for CPU/MEM per process in %
|
||||||
# Default values if not defined: 50/70/90
|
# Default values if not defined: 50/70/90
|
||||||
cpu_careful=50
|
cpu_careful=50
|
||||||
|
@ -123,9 +123,9 @@ td.option-group {
|
|||||||
<div class="document" id="glances">
|
<div class="document" id="glances">
|
||||||
<h1 class="title">Glances</h1>
|
<h1 class="title">Glances</h1>
|
||||||
|
|
||||||
<p>This manual describes <em>Glances</em> version 2.1.</p>
|
<p>This manual describes <em>Glances</em> version 2.1.1.</p>
|
||||||
<p>Copyright © 2012-2014 Nicolas Hennion <<a class="reference external" href="mailto:nicolas@nicolargo.com">nicolas@nicolargo.com</a>></p>
|
<p>Copyright © 2012-2014 Nicolas Hennion <<a class="reference external" href="mailto:nicolas@nicolargo.com">nicolas@nicolargo.com</a>></p>
|
||||||
<p>September 2014</p>
|
<p>October 2014</p>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first">Table of Contents</p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
Glances
|
Glances
|
||||||
=======
|
=======
|
||||||
|
|
||||||
This manual describes *Glances* version 2.1.
|
This manual describes *Glances* version 2.1.1.
|
||||||
|
|
||||||
Copyright © 2012-2014 Nicolas Hennion <nicolas@nicolargo.com>
|
Copyright © 2012-2014 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
|
|
||||||
September 2014
|
October 2014
|
||||||
|
|
||||||
.. contents:: Table of Contents
|
.. contents:: Table of Contents
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"""Init the Glances software."""
|
"""Init the Glances software."""
|
||||||
|
|
||||||
__appname__ = 'glances'
|
__appname__ = 'glances'
|
||||||
__version__ = '2.1'
|
__version__ = '2.1.1'
|
||||||
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
|
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
|
||||||
__license__ = 'LGPL'
|
__license__ = 'LGPL'
|
||||||
|
|
||||||
|
@ -25,9 +25,14 @@ import socket
|
|||||||
import sys
|
import sys
|
||||||
try:
|
try:
|
||||||
from xmlrpc.client import Transport, ServerProxy, ProtocolError, Fault
|
from xmlrpc.client import Transport, ServerProxy, ProtocolError, Fault
|
||||||
except ImportError: # Python 2
|
except ImportError:
|
||||||
|
# Python 2
|
||||||
from xmlrpclib import Transport, ServerProxy, ProtocolError, Fault
|
from xmlrpclib import Transport, ServerProxy, ProtocolError, Fault
|
||||||
import httplib
|
try:
|
||||||
|
import http.client as httplib
|
||||||
|
except:
|
||||||
|
# Python 2
|
||||||
|
import httplib
|
||||||
|
|
||||||
# Import Glances libs
|
# Import Glances libs
|
||||||
from glances.core.glances_globals import version, logger
|
from glances.core.glances_globals import version, logger
|
||||||
|
@ -66,9 +66,6 @@ class GlancesProcesses(object):
|
|||||||
self.process_filter = None
|
self.process_filter = None
|
||||||
self.process_filter_re = None
|
self.process_filter_re = None
|
||||||
|
|
||||||
# !!! ONLY FOR TEST
|
|
||||||
# self.set_process_filter('.*python.*')
|
|
||||||
|
|
||||||
def enable(self):
|
def enable(self):
|
||||||
"""Enable process stats."""
|
"""Enable process stats."""
|
||||||
self.disable_tag = False
|
self.disable_tag = False
|
||||||
@ -158,7 +155,7 @@ class GlancesProcesses(object):
|
|||||||
# Patch for issue #391
|
# Patch for issue #391
|
||||||
try:
|
try:
|
||||||
self.cmdline_cache[procstat['pid']] = ' '.join(proc.cmdline())
|
self.cmdline_cache[procstat['pid']] = ' '.join(proc.cmdline())
|
||||||
except (AttributeError, psutil.AccessDenied, UnicodeDecodeError):
|
except (AttributeError, UnicodeDecodeError, psutil.AccessDenied, psutil.NoSuchProcess):
|
||||||
self.cmdline_cache[procstat['pid']] = ""
|
self.cmdline_cache[procstat['pid']] = ""
|
||||||
procstat['cmdline'] = self.cmdline_cache[procstat['pid']]
|
procstat['cmdline'] = self.cmdline_cache[procstat['pid']]
|
||||||
|
|
||||||
@ -276,6 +273,9 @@ class GlancesProcesses(object):
|
|||||||
pass
|
pass
|
||||||
except psutil.AccessDenied:
|
except psutil.AccessDenied:
|
||||||
procstat['memory_swap'] = None
|
procstat['memory_swap'] = None
|
||||||
|
except:
|
||||||
|
# Add a dirty except to handle the PsUtil issue #413
|
||||||
|
procstat['memory_swap'] = None
|
||||||
|
|
||||||
# Process network connections (TCP and UDP)
|
# Process network connections (TCP and UDP)
|
||||||
try:
|
try:
|
||||||
@ -318,7 +318,7 @@ class GlancesProcesses(object):
|
|||||||
processdict = {}
|
processdict = {}
|
||||||
for proc in psutil.process_iter():
|
for proc in psutil.process_iter():
|
||||||
# If self.get_max_processes() is None: Only retreive mandatory stats
|
# If self.get_max_processes() is None: Only retreive mandatory stats
|
||||||
# Else: retreive mandatoryadn standard stast
|
# Else: retreive mandatory and standard stats
|
||||||
s = self.__get_process_stats(proc,
|
s = self.__get_process_stats(proc,
|
||||||
mandatory_stats=True,
|
mandatory_stats=True,
|
||||||
standard_stats=self.get_max_processes() is None)
|
standard_stats=self.get_max_processes() is None)
|
||||||
@ -348,14 +348,28 @@ class GlancesProcesses(object):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Process optimization
|
||||||
|
# Only retreive stats for visible processes (get_max_processes)
|
||||||
if self.get_max_processes() is not None:
|
if self.get_max_processes() is not None:
|
||||||
# Sort the internal dict and cut the top N (Return a list of tuple)
|
# Sort the internal dict and cut the top N (Return a list of tuple)
|
||||||
# tuple=key (proc), dict (returned by __get_process_stats)
|
# tuple=key (proc), dict (returned by __get_process_stats)
|
||||||
processiter = sorted(processdict.items(), key=lambda x: x[1][self.getsortkey()], reverse=True)
|
try:
|
||||||
first = True
|
processiter = sorted(processdict.items(), key=lambda x: x[1][self.getsortkey()], reverse=True)
|
||||||
for i in processiter[0:self.get_max_processes()]:
|
except TypeError:
|
||||||
# Already existing mandatory stats
|
# Fallback to all process (issue #423)
|
||||||
procstat = i[1]
|
processloop = processdict.items()
|
||||||
|
first = False
|
||||||
|
else:
|
||||||
|
processloop = processiter[0:self.get_max_processes()]
|
||||||
|
first = True
|
||||||
|
else:
|
||||||
|
# Get all processes stats
|
||||||
|
processloop = processdict.items()
|
||||||
|
first = False
|
||||||
|
for i in processloop:
|
||||||
|
# Already existing mandatory stats
|
||||||
|
procstat = i[1]
|
||||||
|
if self.get_max_processes() is not None:
|
||||||
# Update with standard stats
|
# Update with standard stats
|
||||||
# and extended stats but only for TOP (first) process
|
# and extended stats but only for TOP (first) process
|
||||||
s = self.__get_process_stats(i[0],
|
s = self.__get_process_stats(i[0],
|
||||||
@ -365,21 +379,12 @@ class GlancesProcesses(object):
|
|||||||
if s is None:
|
if s is None:
|
||||||
continue
|
continue
|
||||||
procstat.update(s)
|
procstat.update(s)
|
||||||
# Add a specific time_since_update stats for bitrate
|
# Add a specific time_since_update stats for bitrate
|
||||||
procstat['time_since_update'] = time_since_update
|
procstat['time_since_update'] = time_since_update
|
||||||
# Update process list
|
# Update process list
|
||||||
self.processlist.append(procstat)
|
self.processlist.append(procstat)
|
||||||
# Next...
|
# Next...
|
||||||
first = False
|
first = False
|
||||||
else:
|
|
||||||
# Get all the processes
|
|
||||||
for i in processdict.items():
|
|
||||||
# Already existing mandatory and standard stats
|
|
||||||
procstat = i[1]
|
|
||||||
# Add a specific time_since_update stats for bitrate
|
|
||||||
procstat['time_since_update'] = time_since_update
|
|
||||||
# Update process list
|
|
||||||
self.processlist.append(procstat)
|
|
||||||
|
|
||||||
# Clean internals caches if timeout is reached
|
# Clean internals caches if timeout is reached
|
||||||
if self.cache_timer.finished():
|
if self.cache_timer.finished():
|
||||||
|
@ -34,14 +34,8 @@ class GlancesStandalone(object):
|
|||||||
# Init stats
|
# Init stats
|
||||||
self.stats = GlancesStats(config=config, args=args)
|
self.stats = GlancesStats(config=config, args=args)
|
||||||
|
|
||||||
# If configured, set the maximum processes number to display
|
# Default number of processes to displayed is set to 20
|
||||||
try:
|
glances_processes.set_max_processes(20)
|
||||||
max_processes = int(self.stats.get_plugin('processlist').get_conf_value('max_processes'))
|
|
||||||
logger.debug(_("Limit maximum displayed processes to %s") % max_processes)
|
|
||||||
except:
|
|
||||||
max_processes = None
|
|
||||||
logger.warning(_("Maximum displayed processes is not configured (high CPU consumption)"))
|
|
||||||
glances_processes.set_max_processes(max_processes)
|
|
||||||
|
|
||||||
# If process extended stats is disabled by user
|
# If process extended stats is disabled by user
|
||||||
if args.disable_process_extended:
|
if args.disable_process_extended:
|
||||||
|
@ -383,6 +383,7 @@ class GlancesCurses(object):
|
|||||||
# Update the stats messages
|
# Update the stats messages
|
||||||
###########################
|
###########################
|
||||||
|
|
||||||
|
|
||||||
# Update the client server status
|
# Update the client server status
|
||||||
self.args.cs_status = cs_status
|
self.args.cs_status = cs_status
|
||||||
stats_system = stats.get_plugin('system').get_stats_display(args=self.args)
|
stats_system = stats.get_plugin('system').get_stats_display(args=self.args)
|
||||||
@ -400,10 +401,22 @@ class GlancesCurses(object):
|
|||||||
stats_sensors = stats.get_plugin('sensors').get_stats_display(args=self.args)
|
stats_sensors = stats.get_plugin('sensors').get_stats_display(args=self.args)
|
||||||
stats_now = stats.get_plugin('now').get_stats_display()
|
stats_now = stats.get_plugin('now').get_stats_display()
|
||||||
stats_processcount = stats.get_plugin('processcount').get_stats_display(args=self.args)
|
stats_processcount = stats.get_plugin('processcount').get_stats_display(args=self.args)
|
||||||
stats_processlist = stats.get_plugin('processlist').get_stats_display(args=self.args)
|
|
||||||
stats_monitor = stats.get_plugin('monitor').get_stats_display(args=self.args)
|
stats_monitor = stats.get_plugin('monitor').get_stats_display(args=self.args)
|
||||||
stats_alert = stats.get_plugin('alert').get_stats_display(args=self.args)
|
stats_alert = stats.get_plugin('alert').get_stats_display(args=self.args)
|
||||||
|
|
||||||
|
# Adapt number of processes to the available space
|
||||||
|
max_processes_displayed = screen_y - 11 - self.get_stats_display_height(stats_alert)
|
||||||
|
if not self.args.disable_process_extended:
|
||||||
|
max_processes_displayed -= 4
|
||||||
|
if max_processes_displayed < 0:
|
||||||
|
max_processes_displayed = 0
|
||||||
|
if glances_processes.get_max_processes() is None or \
|
||||||
|
glances_processes.get_max_processes() != max_processes_displayed:
|
||||||
|
logger.debug(_("Set number of displayed processes to %s") % max_processes_displayed)
|
||||||
|
glances_processes.set_max_processes(max_processes_displayed)
|
||||||
|
|
||||||
|
stats_processlist = stats.get_plugin('processlist').get_stats_display(args=self.args)
|
||||||
|
|
||||||
# Display the stats on the curses interface
|
# Display the stats on the curses interface
|
||||||
###########################################
|
###########################################
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ class Plugin(GlancesPlugin):
|
|||||||
listsorted = sorted(self.stats,
|
listsorted = sorted(self.stats,
|
||||||
key=lambda process: process[sortedby],
|
key=lambda process: process[sortedby],
|
||||||
reverse=sortedreverse)
|
reverse=sortedreverse)
|
||||||
except KeyError:
|
except (KeyError, TypeError):
|
||||||
listsorted = sorted(self.stats,
|
listsorted = sorted(self.stats,
|
||||||
key=lambda process: process['name'],
|
key=lambda process: process['name'],
|
||||||
reverse=False)
|
reverse=False)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
.TH glances 1 "September, 2014" "version 2.1" "USER COMMANDS"
|
.TH glances 1 "October, 2014" "version 2.1.1" "USER COMMANDS"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
glances \- A cross-platform curses-based system monitoring tool
|
glances \- A cross-platform curses-based system monitoring tool
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -1 +1 @@
|
|||||||
psutil==2.1.1
|
psutil==2.1.3
|
||||||
|
4
setup.py
4
setup.py
@ -40,13 +40,13 @@ def get_requires():
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='Glances',
|
name='Glances',
|
||||||
version='2.1',
|
version='2.1.1',
|
||||||
description="A cross-platform curses-based monitoring tool",
|
description="A cross-platform curses-based monitoring tool",
|
||||||
long_description=open('README.rst').read(),
|
long_description=open('README.rst').read(),
|
||||||
author='Nicolas Hennion',
|
author='Nicolas Hennion',
|
||||||
author_email='nicolas@nicolargo.com',
|
author_email='nicolas@nicolargo.com',
|
||||||
url='https://github.com/nicolargo/glances',
|
url='https://github.com/nicolargo/glances',
|
||||||
# download_url='https://s3.amazonaws.com/glances/glances-2.1.tar.gz',
|
# download_url='https://s3.amazonaws.com/glances/glances-2.1.1.tar.gz',
|
||||||
license="LGPL",
|
license="LGPL",
|
||||||
keywords="cli curses monitoring system",
|
keywords="cli curses monitoring system",
|
||||||
install_requires=get_requires(),
|
install_requires=get_requires(),
|
||||||
|
Loading…
Reference in New Issue
Block a user