Closed
Description
Platform
- Ubuntu 16.04
$ pip show psutil
Name: psutil
Version: 5.4.5
Summary: Cross-platform lib for process and system monitoring in Python.
Home-page: https://github.com/giampaolo/psutil
Author: Giampaolo Rodola
Author-email: g.rodola@gmail.com
License: BSD
Location: /home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages
Bug description
def find_procs_by_name(name):
"Return a list of processes matching 'name'."
ls = []
for p in psutil.process_iter(attrs=['name']):
try:
if name in p.info['name'] or name in getprocname(p):
ls.append(p)
except psutil.NoSuchProcess:
pass
except psutil.AccessDenied:
pass
return ls
def getprocname(pp, joinchar=" "):
# assume pp has pid that exists
ppname1 = str(pp.name())
cmdline = pp.cmdline()
cmdline = [x for x in cmdline if x != '']
ppname2 = str(joinchar.join(cmdline))
if len(ppname1) > len(ppname2):
return ppname1
else:
return ppname2
rarely (but shouldn't ever) gives:
Traceback (most recent call last):
File "/data/jon/h2oai/h2oaicore/systemutils.py", line 3100, in find_procs_by_name
for p in psutil.process_iter(attrs=['name']):
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/__init__.py", line 1440, in process_iter
if proc.is_running():
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/__init__.py", line 569, in is_running
return self == Process(self.pid)
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/__init__.py", line 340, in __init__
self._init(pid)
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/__init__.py", line 367, in _init
self.create_time()
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/__init__.py", line 698, in create_time
self._create_time = self._proc.create_time()
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/_pslinux.py", line 1402, in wrapper
return fun(self, *args, **kwargs)
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/_pslinux.py", line 1584, in create_time
values = self._parse_stat_file()
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/_common.py", line 337, in wrapper
return fun(self)
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/_pslinux.py", line 1441, in _parse_stat_file
with open_binary("%s/%s/stat" % (self._procfs_path, self.pid)) as f:
File "/home/jon/.pyenv/versions/3.6.4/lib/python3.6/site-packages/psutil/_pslinux.py", line 187, in open_binary
return open(fname, "rb", **kwargs)
FileNotFoundError: [Errno 2] No such file or directory: '/proc/12825/stat'
I thought process_iter() and proc.is_running() were supposed to be robust against processes going away, etc.
I basically have to stop using psutil's process iter because it's not reliable. Instead, have to use "ps" on command line via subprocess.check_output().