python-linux-procfs: Fix when pids complete
- Propagate an error to the user when a pid completes - Handle a pid disappearing in pflags Resolves: rhbz#2012288 Signed-off-by: John Kacur <jkacur@redhat.com>
This commit is contained in:
parent
0ebf821b7e
commit
177c3d2403
68
python-linux-procfs-Propagate-error-to-user-if-a-pid.patch
Normal file
68
python-linux-procfs-Propagate-error-to-user-if-a-pid.patch
Normal file
@ -0,0 +1,68 @@
|
||||
From b7ea06b21456d465f2d9d11358fb803eb277357f Mon Sep 17 00:00:00 2001
|
||||
From: John Kacur <jkacur@redhat.com>
|
||||
Date: Tue, 23 Nov 2021 09:58:58 -0500
|
||||
Subject: [PATCH 1/3] python-linux-procfs: Propagate error to user if a pid is
|
||||
completed
|
||||
|
||||
If a pid is completed and disappears a FileNotFoundError will occur
|
||||
because /proc/pid/stat will disappear too.
|
||||
|
||||
It is not possible to check for the file first because it could still
|
||||
disappear between the time of the check and the time of use.
|
||||
|
||||
Propagate this error to the user.
|
||||
The user should handle this with a try, except clause and ignore it if
|
||||
an exception occurs.
|
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com>
|
||||
---
|
||||
procfs/procfs.py | 19 ++++++++++++++++---
|
||||
1 file changed, 16 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/procfs/procfs.py b/procfs/procfs.py
|
||||
index 408b2bcd0a31..a0e9977214fe 100755
|
||||
--- a/procfs/procfs.py
|
||||
+++ b/procfs/procfs.py
|
||||
@@ -130,7 +130,12 @@ class pidstat:
|
||||
|
||||
def __init__(self, pid, basedir="/proc"):
|
||||
self.pid = pid
|
||||
- self.load(basedir)
|
||||
+ try:
|
||||
+ self.load(basedir)
|
||||
+ except FileNotFoundError:
|
||||
+ # The file representing the pid has disappeared
|
||||
+ # propagate the error to the user to handle
|
||||
+ raise
|
||||
|
||||
def __getitem__(self, fieldname):
|
||||
return self.fields[fieldname]
|
||||
@@ -151,7 +156,11 @@ class pidstat:
|
||||
return fieldname in self.fields
|
||||
|
||||
def load(self, basedir="/proc"):
|
||||
- f = open("%s/%d/stat" % (basedir, self.pid))
|
||||
+ try:
|
||||
+ f = open("%s/%d/stat" % (basedir, self.pid))
|
||||
+ except FileNotFoundError:
|
||||
+ # The pid has disappeared, propagate the error
|
||||
+ raise
|
||||
fields = f.readline().strip().split(') ')
|
||||
f.close()
|
||||
fields = fields[0].split(' (') + fields[1].split()
|
||||
@@ -338,7 +347,11 @@ class process:
|
||||
else:
|
||||
sclass = pidstatus
|
||||
|
||||
- setattr(self, attr, sclass(self.pid, self.basedir))
|
||||
+ try:
|
||||
+ setattr(self, attr, sclass(self.pid, self.basedir))
|
||||
+ except FileNotFoundError:
|
||||
+ # The pid has disappeared, progate the error
|
||||
+ raise
|
||||
elif attr == "cmdline":
|
||||
self.load_cmdline()
|
||||
elif attr == "threads":
|
||||
--
|
||||
2.31.1
|
||||
|
50
python-linux-procfs-pflags-Handle-pids-that-complete.patch
Normal file
50
python-linux-procfs-pflags-Handle-pids-that-complete.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From eb984b30e325bbf27844bf9c1f90767504468db5 Mon Sep 17 00:00:00 2001
|
||||
From: John Kacur <jkacur@redhat.com>
|
||||
Date: Tue, 23 Nov 2021 13:01:05 -0500
|
||||
Subject: [PATCH 2/3] python-linux-procfs: pflags: Handle pids that completed
|
||||
|
||||
Sometimes pids disappear when they are completed.
|
||||
|
||||
Programs such as pflags that use procfs must account for that.
|
||||
The solution is to simply recognize this situation, and to continue.
|
||||
|
||||
Signed-off-by: John Kacur <jkacur@redhat.com>
|
||||
---
|
||||
pflags | 15 +++++++++++++--
|
||||
1 file changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/pflags b/pflags
|
||||
index 3407b6f51c96..46d396c87c2b 100755
|
||||
--- a/pflags
|
||||
+++ b/pflags
|
||||
@@ -50,14 +50,25 @@ def main(argv):
|
||||
pids = list(ps.processes.keys())
|
||||
|
||||
pids.sort()
|
||||
- len_comms = [len(ps[pid]["stat"]["comm"]) for pid in pids if pid in ps]
|
||||
+ len_comms = []
|
||||
+ for pid in pids:
|
||||
+ if pid in ps:
|
||||
+ try:
|
||||
+ len(ps[pid]["stat"]["comm"])
|
||||
+ except (TypeError, FileNotFoundError):
|
||||
+ continue
|
||||
+ len_comms.append(len(ps[pid]["stat"]["comm"]))
|
||||
+
|
||||
max_comm_len = max(len_comms, default=0)
|
||||
del len_comms
|
||||
|
||||
for pid in pids:
|
||||
if pid not in ps:
|
||||
continue
|
||||
- flags = ps[pid].stat.process_flags()
|
||||
+ try:
|
||||
+ flags = ps[pid].stat.process_flags()
|
||||
+ except AttributeError:
|
||||
+ continue
|
||||
# Remove flags that were superseeded
|
||||
if "PF_THREAD_BOUND" in flags and "PF_NO_SETAFFINITY" in flags:
|
||||
flags.remove("PF_THREAD_BOUND")
|
||||
--
|
||||
2.31.1
|
||||
|
@ -1,6 +1,6 @@
|
||||
Name: python-linux-procfs
|
||||
Version: 0.6.3
|
||||
Release: 3%{?dist}
|
||||
Release: 4%{?dist}
|
||||
License: GPLv2
|
||||
Summary: Linux /proc abstraction classes
|
||||
URL: https://git.kernel.org/pub/scm/libs/python/%{name}/%{name}.git
|
||||
@ -14,6 +14,8 @@ Abstractions to extract information from the Linux kernel /proc files.
|
||||
|
||||
# PATCHES
|
||||
Patch1: python-linux-procfs-Fix-traceback-with-non-utf8-char.patch
|
||||
Patch2: python-linux-procfs-Propagate-error-to-user-if-a-pid.patch
|
||||
Patch3: python-linux-procfs-pflags-Handle-pids-that-complete.patch
|
||||
|
||||
%description %_description
|
||||
|
||||
@ -21,7 +23,7 @@ Patch1: python-linux-procfs-Fix-traceback-with-non-utf8-char.patch
|
||||
Summary: %summary
|
||||
%{?python_provide:%python_provide python3-linux-procfs}
|
||||
|
||||
Requires: python3-six
|
||||
Requires: python3
|
||||
|
||||
%description -n python3-linux-procfs %_description
|
||||
|
||||
@ -44,6 +46,11 @@ rm -rf %{buildroot}
|
||||
%license COPYING
|
||||
|
||||
%changelog
|
||||
* Tue Nov 23 2021 John Kacur <jkacur@redhat.com> - 0.6.3-4
|
||||
- Propagate error to user if pid completed
|
||||
- Handle pid completed in pflags
|
||||
Resolves: rhbz#2012288
|
||||
|
||||
* Mon Nov 22 2021 John Kacur <jkacur@redhat.com> - 0.6.3-3
|
||||
- Fix traceback with non-utf8 chars
|
||||
Resolves: rhbz#2022530
|
||||
|
Loading…
Reference in New Issue
Block a user