summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolargo <nicolas@nicolargo.com>2014-08-25 22:02:10 +0200
committerNicolargo <nicolas@nicolargo.com>2014-08-25 22:02:10 +0200
commitc21f7e3fb8ab8226700aa8246ab1026b827db302 (patch)
tree597992f4ec4845d115d46c7b8928880774ac9986
parent630b14ac45145cae59a810987004687bccac9d36 (diff)
RC4 - Try and catch stats grab in client/server mode (correct NoSuchProcess issue)
-rw-r--r--glances/__init__.py2
-rw-r--r--glances/core/glances_processes.py45
2 files changed, 37 insertions, 10 deletions
diff --git a/glances/__init__.py b/glances/__init__.py
index 09741a91..9f5d4175 100644
--- a/glances/__init__.py
+++ b/glances/__init__.py
@@ -20,7 +20,7 @@
"""Init the Glances software."""
__appname__ = 'glances'
-__version__ = '2.1_RC3'
+__version__ = '2.1_RC4'
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
__license__ = 'LGPL'
diff --git a/glances/core/glances_processes.py b/glances/core/glances_processes.py
index 7f7b2ec9..10f4484b 100644
--- a/glances/core/glances_processes.py
+++ b/glances/core/glances_processes.py
@@ -201,6 +201,8 @@ class GlancesProcesses(object):
except KeyError:
try:
self.username_cache[procstat['pid']] = proc.username()
+ except psutil.NoSuchProcess:
+ pass
except (KeyError, psutil.AccessDenied):
try:
self.username_cache[procstat['pid']] = proc.uids().real
@@ -209,8 +211,12 @@ class GlancesProcesses(object):
procstat['username'] = self.username_cache[procstat['pid']]
# Process status, nice, memory_info and cpu_times
- procstat.update(proc.as_dict(attrs=['status', 'nice', 'memory_info', 'cpu_times']))
- procstat['status'] = str(procstat['status'])[:1].upper()
+ try:
+ procstat.update(proc.as_dict(attrs=['status', 'nice', 'memory_info', 'cpu_times']))
+ except psutil.NoSuchProcess:
+ pass
+ else:
+ procstat['status'] = str(procstat['status'])[:1].upper()
if extended_stats and not self.disable_extended_tag:
procstat['extended_stats'] = True
@@ -218,32 +224,45 @@ class GlancesProcesses(object):
# CPU affinity (Windows and Linux only)
try:
procstat.update(proc.as_dict(attrs=['cpu_affinity']))
+ except psutil.NoSuchProcess:
+ pass
except AttributeError:
procstat['cpu_affinity'] = None
# Memory extended
try:
procstat.update(proc.as_dict(attrs=['memory_info_ex']))
+ except psutil.NoSuchProcess:
+ pass
except AttributeError:
procstat['memory_info_ex'] = None
# Number of context switch
try:
procstat.update(proc.as_dict(attrs=['num_ctx_switches']))
+ except psutil.NoSuchProcess:
+ pass
except AttributeError:
procstat['num_ctx_switches'] = None
# Number of file descriptors (Unix only)
try:
procstat.update(proc.as_dict(attrs=['num_fds']))
+ except psutil.NoSuchProcess:
+ pass
except AttributeError:
procstat['num_fds'] = None
# Threads number
try:
procstat.update(proc.as_dict(attrs=['num_threads']))
+ except psutil.NoSuchProcess:
+ pass
except AttributeError:
procstat['num_threads'] = None
# Number of handles (Windows only)
if is_windows:
- procstat.update(proc.as_dict(attrs=['num_handles']))
+ try:
+ procstat.update(proc.as_dict(attrs=['num_handles']))
+ except psutil.NoSuchProcess:
+ pass
else:
procstat['num_handles'] = None
@@ -252,6 +271,8 @@ class GlancesProcesses(object):
if is_linux:
try:
procstat['memory_swap'] = sum([v.swap for v in proc.memory_maps()])
+ except psutil.NoSuchProcess:
+ pass
except psutil.AccessDenied:
procstat['memory_swap'] = None
@@ -266,7 +287,10 @@ class GlancesProcesses(object):
# IO Nice
# http://pythonhosted.org/psutil/#psutil.Process.ionice
if is_linux or is_windows:
- procstat.update(proc.as_dict(attrs=['ionice']))
+ try:
+ procstat.update(proc.as_dict(attrs=['ionice']))
+ except psutil.NoSuchProcess:
+ pass
else:
procstat['ionice'] = None
@@ -298,7 +322,7 @@ class GlancesProcesses(object):
mandatory_stats=True,
standard_stats=self.get_max_processes() is None)
# Continue to the next process if it has to be filtered
- if self.is_filtered(s['cmdline']) and self.is_filtered(s['name']):
+ if s is None or (self.is_filtered(s['cmdline']) and self.is_filtered(s['name'])):
continue
# Ok add the process to the list
processdict[proc] = s
@@ -333,10 +357,13 @@ class GlancesProcesses(object):
procstat = i[1]
# Update with standard stats
# and extended stats but only for TOP (first) process
- procstat.update(self.__get_process_stats(i[0],
- mandatory_stats=False,
- standard_stats=True,
- extended_stats=first))
+ s = self.__get_process_stats(i[0],
+ mandatory_stats=False,
+ standard_stats=True,
+ extended_stats=first)
+ if s is None:
+ continue
+ procstat.update(s)
# Add a specific time_since_update stats for bitrate
procstat['time_since_update'] = time_since_update
# Update process list