From a848e817c063d9d83804f24328c3315380f9b555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 19 Jun 2018 10:49:57 +0200 Subject: [PATCH 01/22] Rebuilt for Python 3.7 --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 39630e1..c17f86b 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 6%{?dist} +Release: 7%{?dist} Summary: Memory profiling tool Group: Applications/System License: LGPLv2 @@ -47,6 +47,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Tue Jun 19 2018 Miro Hrončok - 3.6-7 +- Rebuilt for Python 3.7 + * Fri Feb 09 2018 Fedora Release Engineering - 3.6-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild From dbfac54c733bacea2db60cb268b9a91bd5efd965 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 13 Jul 2018 22:55:12 +0000 Subject: [PATCH 02/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index c17f86b..2341dc3 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 7%{?dist} +Release: 8%{?dist} Summary: Memory profiling tool Group: Applications/System License: LGPLv2 @@ -47,6 +47,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 13 2018 Fedora Release Engineering - 3.6-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + * Tue Jun 19 2018 Miro Hrončok - 3.6-7 - Rebuilt for Python 3.7 From b68a3dc6232cca9f07222a77b34a191aa6745f13 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Mon, 28 Jan 2019 20:18:13 +0100 Subject: [PATCH 03/22] Remove obsolete Group tag References: https://fedoraproject.org/wiki/Changes/Remove_Group_Tag --- ps_mem.spec | 1 - 1 file changed, 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 2341dc3..02f7404 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -3,7 +3,6 @@ Name: ps_mem Version: 3.6 Release: 8%{?dist} Summary: Memory profiling tool -Group: Applications/System License: LGPLv2 URL: https://github.com/pixelb/ps_mem From dba7973c28b4a8430ed2e16ed6917ef327a67c07 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 2 Feb 2019 04:54:05 +0000 Subject: [PATCH 04/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 02f7404..7671b7e 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 8%{?dist} +Release: 9%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Sat Feb 02 2019 Fedora Release Engineering - 3.6-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + * Fri Jul 13 2018 Fedora Release Engineering - 3.6-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild From a97d04b88119abdad2ddd689bd61f3fcd2d3dcb7 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 26 Jul 2019 11:24:08 +0000 Subject: [PATCH 05/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 7671b7e..474ab34 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 9%{?dist} +Release: 10%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 26 2019 Fedora Release Engineering - 3.6-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + * Sat Feb 02 2019 Fedora Release Engineering - 3.6-9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild From c994656df934e86a33a1882f7d5872c3dde99ec2 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 30 Jan 2020 09:51:26 +0000 Subject: [PATCH 06/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 474ab34..fb11c5a 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 10%{?dist} +Release: 11%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Thu Jan 30 2020 Fedora Release Engineering - 3.6-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + * Fri Jul 26 2019 Fedora Release Engineering - 3.6-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild From 20ff6794d936812f955d997e51c75694d58ea1ff Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Tue, 28 Jul 2020 23:05:07 +0000 Subject: [PATCH 07/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index fb11c5a..64fead1 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 11%{?dist} +Release: 12%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Tue Jul 28 2020 Fedora Release Engineering - 3.6-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + * Thu Jan 30 2020 Fedora Release Engineering - 3.6-11 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild From 9db2f7833869dca8f39faf0648b9c421fddb844f Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 27 Jan 2021 08:39:38 +0000 Subject: [PATCH 08/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 64fead1..f91094d 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 12%{?dist} +Release: 13%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Wed Jan 27 2021 Fedora Release Engineering - 3.6-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + * Tue Jul 28 2020 Fedora Release Engineering - 3.6-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild From fd70cb0912a9300909f574148e628d06b4fdad0d Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 23 Jul 2021 04:09:24 +0000 Subject: [PATCH 09/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index f91094d..363258c 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 13%{?dist} +Release: 14%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 23 2021 Fedora Release Engineering - 3.6-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + * Wed Jan 27 2021 Fedora Release Engineering - 3.6-13 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild From 4191c54c0f80427b2e0c61b03c02c3a64a1325b7 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 21 Jan 2022 09:33:02 +0000 Subject: [PATCH 10/22] - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 363258c..2aa178a 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.6 -Release: 14%{?dist} +Release: 15%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jan 21 2022 Fedora Release Engineering - 3.6-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + * Fri Jul 23 2021 Fedora Release Engineering - 3.6-14 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild From 0b05c4858fa61483fb038aac95431e4e1ed8b41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 11 Jul 2022 23:28:06 +0100 Subject: [PATCH 11/22] latest upstream (3.14) --- ps_mem.1 | 13 +- ps_mem.py | 405 +++++++++++++++++++++++++++++++++++++--------------- ps_mem.spec | 7 +- 3 files changed, 306 insertions(+), 119 deletions(-) diff --git a/ps_mem.1 b/ps_mem.1 index 12bf337..f2771c1 100644 --- a/ps_mem.1 +++ b/ps_mem.1 @@ -1,6 +1,6 @@ .\" Simple man page to ps_mem script .\" Contact fholec@redhat.com -.TH ps_mem 1 "04 October 2014" "" "" +.TH ps_mem 1 "25 May 2018" "" "" .SH NAME ps_mem \- Memory profiling tool .SH SYNOPSIS @@ -25,9 +25,20 @@ The shared RAM is problematic to calculate, and the tool automatically selects t \-h \-\-help Show help message .TP +\-\-version +Show version info +.TP \-p PID[,PID2,...PIDN] Show memory consumption for the specified processes .TP +\-S \-\-swap +Show swap information of each item +(and Shared swap if the kernel supports SwapPss). +.TP +\-d \-\-discriminate-by-pid +Show and separate memory usage entries by process +rather than by program. +.TP \-s \-\-split\-args Show and separate memory usage entries by command line arguments and not just the program name. diff --git a/ps_mem.py b/ps_mem.py index 8e30bce..d03a987 100644 --- a/ps_mem.py +++ b/ps_mem.py @@ -9,7 +9,7 @@ # Licence: LGPLv2 # Author: P@draigBrady.com -# Source: http://www.pixelbeat.org/scripts/ps_mem.py +# Source: https://www.pixelbeat.org/scripts/ps_mem.py # V1.0 06 Jul 2005 Initial release # V1.1 11 Aug 2006 root permission required for accuracy @@ -36,8 +36,8 @@ # Patch from patrice.bouchand.fedora@gmail.com # V1.9 20 Feb 2008 Fix invalid values reported when PSS is available. # Reported by Andrey Borzenkov -# V3.6 16 Oct 2015 -# http://github.com/pixelb/scripts/commits/master/scripts/ps_mem.py +# V3.14 28 May 2022 +# https://github.com/pixelb/ps_mem/commits/master/ps_mem.py # Notes: # @@ -73,11 +73,12 @@ # FreeBSD is supported if linprocfs is mounted at /compat/linux/proc/ # FreeBSD 8.0 supports up to a level of Linux 2.6.16 -import getopt -import time +import argparse import errno import os import sys +import time +import io # The following exits cleanly on Ctrl-C or EPIPE # while treating other exceptions as before. @@ -99,6 +100,17 @@ PAGESIZE = os.sysconf("SC_PAGE_SIZE") / 1024 #KiB our_pid = os.getpid() have_pss = 0 +have_swap_pss = 0 + +class Unbuffered(io.TextIOBase): + def __init__(self, stream): + super(Unbuffered, self).__init__() + self.stream = stream + def write(self, data): + self.stream.write(data) + self.stream.flush() + def close(self): + self.stream.close() class Proc: def __init__(self): @@ -118,9 +130,12 @@ class Proc: else: return open(self.path(*args), errors='ignore') except (IOError, OSError): + if type(args[0]) is not int: + raise val = sys.exc_info()[1] if (val.errno == errno.ENOENT or # kernel thread or process gone - val.errno == errno.EPERM): + val.errno == errno.EPERM or + val.errno == errno.EACCES): raise LookupError raise @@ -132,59 +147,68 @@ proc = Proc() # def parse_options(): - try: - long_options = ['split-args', 'help', 'total'] - opts, args = getopt.getopt(sys.argv[1:], "shtp:w:", long_options) - except getopt.GetoptError: - sys.stderr.write(help()) - sys.exit(3) + help_msg = 'Show program core memory usage.' + parser = argparse.ArgumentParser(prog='ps_mem', description=help_msg) + parser.add_argument('--version', action='version', version='3.14') + parser.add_argument( + '-s', '--split-args', + action='store_true', + help='Show and separate by, all command line arguments', + ) + parser.add_argument( + '-t', '--total', + dest='only_total', + action='store_true', + help='Show only the total value', + ) + parser.add_argument( + '-d', '--discriminate-by-pid', + action='store_true', + help='Show by process rather than by program', + ) + parser.add_argument( + '-S', '--swap', + dest='show_swap', + action='store_true', + help='Show swap information', + ) + parser.add_argument( + '-p', + dest='pids', + metavar='[,pid2,...pidN]', + help='Only show memory usage PIDs in the specified list', + ) + parser.add_argument( + '-w', + dest='watch', + metavar='', + type=int, + help='Measure and show process memory every N seconds', + ) + args = parser.parse_args() - if len(args): - sys.stderr.write("Extraneous arguments: %s\n" % args) - sys.exit(3) + args.pids_to_show = [] + if args.pids: + try: + args.pids_to_show = [int(x) for x in args.pids.split(',')] + except ValueError: + parser.error('Invalid PID(s): %s' % args.pids) - # ps_mem.py options - split_args = False - pids_to_show = None - watch = None - only_total = False + if args.watch is not None: + if args.watch <= 0: + parser.error('Seconds must be positive! (%s)' % args.watch) - for o, a in opts: - if o in ('-s', '--split-args'): - split_args = True - if o in ('-t', '--total'): - only_total = True - if o in ('-h', '--help'): - sys.stdout.write(help()) - sys.exit(0) - if o in ('-p',): - try: - pids_to_show = [int(x) for x in a.split(',')] - except: - sys.stderr.write(help()) - sys.exit(3) - if o in ('-w',): - try: - watch = int(a) - except: - sys.stderr.write(help()) - sys.exit(3) + return ( + args.split_args, + args.pids_to_show, + args.watch, + args.only_total, + args.discriminate_by_pid, + args.show_swap, + ) - return (split_args, pids_to_show, watch, only_total) -def help(): - help_msg = 'Usage: ps_mem [OPTION]...\n' \ - 'Show program core memory usage\n' \ - '\n' \ - ' -h, -help Show this help\n' \ - ' -p [,pid2,...pidN] Only show memory usage PIDs in the specified list\n' \ - ' -s, --split-args Show and separate by, all command line arguments\n' \ - ' -t, --total Show only the total value\n' \ - ' -w Measure and show process memory every N seconds\n' - - return help_msg - -#(major,minor,release) +# (major,minor,release) def kernel_ver(): kv = proc.open('sys/kernel/osrelease').readline().split(".")[:3] last = len(kv) @@ -202,50 +226,84 @@ def kernel_ver(): return (int(kv[0]), int(kv[1]), int(kv[2])) -#return Private,Shared +#return Private,Shared,Swap(Pss),unique_id #Note shared is always a subset of rss (trs is not always) def getMemStats(pid): global have_pss + global have_swap_pss mem_id = pid #unique Private_lines = [] Shared_lines = [] + Private_huge_lines = [] + Shared_huge_lines = [] Pss_lines = [] Rss = (int(proc.open(pid, 'statm').readline().split()[1]) * PAGESIZE) - if os.path.exists(proc.path(pid, 'smaps')): #stat - lines = proc.open(pid, 'smaps').readlines() #open + Swap_lines = [] + Swap_pss_lines = [] + + Swap = 0 + + if os.path.exists(proc.path(pid, 'smaps')): # stat + smaps = 'smaps' + if os.path.exists(proc.path(pid, 'smaps_rollup')): + smaps = 'smaps_rollup' # faster to process + lines = proc.open(pid, smaps).readlines() # open # Note we checksum smaps as maps is usually but # not always different for separate processes. mem_id = hash(''.join(lines)) for line in lines: - if line.startswith("Shared"): + # {Private,Shared}_Hugetlb is not included in Pss (why?) + # so we need to account for separately. + if line.startswith("Private_Hugetlb:"): + Private_huge_lines.append(line) + elif line.startswith("Shared_Hugetlb:"): + Shared_huge_lines.append(line) + elif line.startswith("Shared"): Shared_lines.append(line) elif line.startswith("Private"): Private_lines.append(line) - elif line.startswith("Pss"): + elif line.startswith("Pss:"): have_pss = 1 Pss_lines.append(line) + elif line.startswith("Swap:"): + Swap_lines.append(line) + elif line.startswith("SwapPss:"): + have_swap_pss = 1 + Swap_pss_lines.append(line) Shared = sum([int(line.split()[1]) for line in Shared_lines]) Private = sum([int(line.split()[1]) for line in Private_lines]) + Shared_huge = sum([int(line.split()[1]) for line in Shared_huge_lines]) + Private_huge = sum([int(line.split()[1]) for line in Private_huge_lines]) #Note Shared + Private = Rss above #The Rss in smaps includes video card mem etc. if have_pss: - pss_adjust = 0.5 # add 0.5KiB as this avg error due to trunctation + pss_adjust = 0.5 # add 0.5KiB as this avg error due to truncation Pss = sum([float(line.split()[1])+pss_adjust for line in Pss_lines]) Shared = Pss - Private + Private += Private_huge # Add after as PSS doesn't a/c for huge pages + if have_swap_pss: + # The kernel supports SwapPss, that shows proportional swap share. + # Note that Swap - SwapPss is not Private Swap. + Swap = sum([int(line.split()[1]) for line in Swap_pss_lines]) + else: + # Note that Swap = Private swap + Shared swap. + Swap = sum([int(line.split()[1]) for line in Swap_lines]) elif (2,6,1) <= kernel_ver() <= (2,6,9): Shared = 0 #lots of overestimation, but what can we do? + Shared_huge = 0 Private = Rss else: Shared = int(proc.open(pid, 'statm').readline().split()[2]) Shared *= PAGESIZE + Shared_huge = 0 Private = Rss - Shared - return (Private, Shared, mem_id) + return (Private, Shared, Shared_huge, Swap, mem_id) -def getCmdName(pid, split_args): +def getCmdName(pid, split_args, discriminate_by_pid, exe_only=False): cmdline = proc.open(pid, 'cmdline').read().split("\0") - if cmdline[-1] == '' and len(cmdline) > 1: + while cmdline[-1] == '' and len(cmdline) > 1: cmdline = cmdline[:-1] path = proc.path(pid, 'exe') @@ -257,12 +315,13 @@ def getCmdName(pid, split_args): except OSError: val = sys.exc_info()[1] if (val.errno == errno.ENOENT or # either kernel thread or process gone - val.errno == errno.EPERM): + val.errno == errno.EPERM or + val.errno == errno.EACCES): raise LookupError raise if split_args: - return " ".join(cmdline) + return ' '.join(cmdline).replace('\n', ' ') if path.endswith(" (deleted)"): path = path[:-10] if os.path.exists(path): @@ -276,17 +335,38 @@ def getCmdName(pid, split_args): else: path += " [deleted]" exe = os.path.basename(path) - cmd = proc.open(pid, 'status').readline()[6:-1] + if exe_only: return exe + + proc_status = proc.open(pid, 'status').readlines() + cmd = proc_status[0][6:-1] if exe.startswith(cmd): cmd = exe #show non truncated version #Note because we show the non truncated name #one can have separated programs as follows: #584.0 KiB + 1.0 MiB = 1.6 MiB mozilla-thunder (exe -> bash) # 56.0 MiB + 22.2 MiB = 78.2 MiB mozilla-thunderbird-bin - if sys.version_info < (3,): - return cmd else: - return cmd.encode(errors='replace').decode() + #Lookup the parent's exe and use that if matching + #which will merge "Web Content" with "firefox" for example + ppid = 0 + for l in range(10): + ps_line = proc_status[l] + if ps_line.startswith('PPid:'): + ppid = int(ps_line[6:-1]) + break + if ppid: + try: + p_exe = getCmdName(ppid, False, False, exe_only=True) + except LookupError: + pass + else: + if exe == p_exe: + cmd = exe + if sys.version_info >= (3,): + cmd = cmd.encode(errors='replace').decode() + if discriminate_by_pid: + cmd = '%s [%d]' % (cmd, pid) + return cmd #The following matches "du -h" output @@ -309,62 +389,99 @@ def cmd_with_count(cmd, count): return cmd #Warn of possible inaccuracies +#RAM: #2 = accurate & can total #1 = accurate only considering each process in isolation #0 = some shared mem not reported #-1= all shared mem not reported -def shared_val_accuracy(): +#SWAP: +#2 = accurate & can total +#1 = accurate only considering each process in isolation +#-1= not available +def val_accuracy(show_swap): """http://wiki.apache.org/spamassassin/TopSharedMemoryBug""" kv = kernel_ver() pid = os.getpid() + swap_accuracy = -1 if kv[:2] == (2,4): if proc.open('meminfo').read().find("Inact_") == -1: - return 1 - return 0 + return 1, swap_accuracy + return 0, swap_accuracy elif kv[:2] == (2,6): if os.path.exists(proc.path(pid, 'smaps')): + swap_accuracy = 1 if proc.open(pid, 'smaps').read().find("Pss:")!=-1: - return 2 + return 2, swap_accuracy else: - return 1 + return 1, swap_accuracy if (2,6,1) <= kv <= (2,6,9): - return -1 - return 0 + return -1, swap_accuracy + return 0, swap_accuracy elif kv[0] > 2 and os.path.exists(proc.path(pid, 'smaps')): - return 2 + swap_accuracy = 1 + if show_swap and proc.open(pid, 'smaps').read().find("SwapPss:")!=-1: + swap_accuracy = 2 + return 2, swap_accuracy else: - return 1 + return 1, swap_accuracy -def show_shared_val_accuracy( possible_inacc, only_total=False ): +def show_val_accuracy( ram_inacc, swap_inacc, only_total, show_swap ): level = ("Warning","Error")[only_total] - if possible_inacc == -1: + + # Only show significant warnings + if not show_swap: + swap_inacc = 2 + elif only_total: + ram_inacc = 2 + + if ram_inacc == -1: sys.stderr.write( "%s: Shared memory is not reported by this system.\n" % level ) sys.stderr.write( "Values reported will be too large, and totals are not reported\n" ) - elif possible_inacc == 0: + elif ram_inacc == 0: sys.stderr.write( "%s: Shared memory is not reported accurately by this system.\n" % level ) sys.stderr.write( "Values reported could be too large, and totals are not reported\n" ) - elif possible_inacc == 1: + elif ram_inacc == 1: sys.stderr.write( "%s: Shared memory is slightly over-estimated by this system\n" "for each program, so totals are not reported.\n" % level ) - sys.stderr.close() - if only_total and possible_inacc != 2: - sys.exit(1) -def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=False ): + if swap_inacc == -1: + sys.stderr.write( + "%s: Swap is not reported by this system.\n" % level + ) + elif swap_inacc == 1: + sys.stderr.write( + "%s: Swap is over-estimated by this system for each program,\n" + "so totals are not reported.\n" % level + ) + + sys.stderr.close() + if only_total: + if show_swap: + accuracy = swap_inacc + else: + accuracy = ram_inacc + if accuracy != 2: + sys.exit(1) + + +def get_memory_usage(pids_to_show, split_args, discriminate_by_pid, + include_self=False, only_self=False): cmds = {} shareds = {} + shared_huges = {} mem_ids = {} count = {} + swaps = {} for pid in os.listdir(proc.path('')): if not pid.isdigit(): continue @@ -375,11 +492,11 @@ def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=Fa continue if pid == our_pid and not include_self: continue - if pids_to_show is not None and pid not in pids_to_show: + if pids_to_show and pid not in pids_to_show: continue try: - cmd = getCmdName(pid, split_args) + cmd = getCmdName(pid, split_args, discriminate_by_pid) except LookupError: #operation not permitted #kernel threads don't have exe links or @@ -387,7 +504,7 @@ def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=Fa continue try: - private, shared, mem_id = getMemStats(pid) + private, shared, shared_huge, swap, mem_id = getMemStats(pid) except RuntimeError: continue #process gone if shareds.get(cmd): @@ -397,15 +514,27 @@ def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=Fa shareds[cmd] = shared else: shareds[cmd] = shared + if shared_huges.get(cmd): + if shared_huges[cmd] < shared_huge: #just take largest shared_huge + shared_huges[cmd] = shared_huge + else: + shared_huges[cmd] = shared_huge cmds[cmd] = cmds.setdefault(cmd, 0) + private if cmd in count: count[cmd] += 1 else: count[cmd] = 1 - mem_ids.setdefault(cmd, {}).update({mem_id:None}) + mem_ids.setdefault(cmd, {}).update({mem_id: None}) - #Add shared mem for each program + # Swap (overcounting for now...) + swaps[cmd] = swaps.setdefault(cmd, 0) + swap + + # Total swaped mem for each program + total_swap = 0 + + # Add shared mem for each program total = 0 + for cmd in cmds: cmd_count = count[cmd] if len(mem_ids[cmd]) == 1 and cmd_count > 1: @@ -414,35 +543,61 @@ def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=Fa cmds[cmd] /= cmd_count if have_pss: shareds[cmd] /= cmd_count + # overestimation possible if shared_huges shared across commands + shareds[cmd] += shared_huges[cmd] cmds[cmd] = cmds[cmd] + shareds[cmd] - total += cmds[cmd] #valid if PSS available + total += cmds[cmd] # valid if PSS available + total_swap += swaps[cmd] sorted_cmds = sorted(cmds.items(), key=lambda x:x[1]) sorted_cmds = [x for x in sorted_cmds if x[1]] - return sorted_cmds, shareds, count, total + return sorted_cmds, shareds, count, total, swaps, total_swap -def print_header(): - sys.stdout.write(" Private + Shared = RAM used\tProgram\n\n") +def print_header(show_swap, discriminate_by_pid): + output_string = " Private + Shared = RAM used" + if show_swap: + output_string += " Swap used" + output_string += "\tProgram" + if discriminate_by_pid: + output_string += "[pid]" + output_string += "\n\n" + sys.stdout.write(output_string) -def print_memory_usage(sorted_cmds, shareds, count, total): + +def print_memory_usage(sorted_cmds, shareds, count, total, swaps, total_swap, + show_swap): for cmd in sorted_cmds: - sys.stdout.write("%9s + %9s = %9s\t%s\n" % - (human(cmd[1]-shareds[cmd[0]]), - human(shareds[cmd[0]]), human(cmd[1]), - cmd_with_count(cmd[0], count[cmd[0]]))) - if have_pss: + + output_string = "%9s + %9s = %9s" + output_data = (human(cmd[1]-shareds[cmd[0]]), + human(shareds[cmd[0]]), human(cmd[1])) + if show_swap: + output_string += " %9s" + output_data += (human(swaps[cmd[0]]),) + output_string += "\t%s\n" + output_data += (cmd_with_count(cmd[0], count[cmd[0]]),) + + sys.stdout.write(output_string % output_data) + + # Only show totals if appropriate + if have_swap_pss and show_swap: # kernel will have_pss + sys.stdout.write("%s\n%s%9s%s%9s\n%s\n" % + ("-" * 45, " " * 24, human(total), " " * 3, + human(total_swap), "=" * 45)) + elif have_pss: sys.stdout.write("%s\n%s%9s\n%s\n" % ("-" * 33, " " * 24, human(total), "=" * 33)) -def verify_environment(): - if os.geteuid() != 0: - sys.stderr.write("Sorry, root permission required.\n") + +def verify_environment(pids_to_show): + if os.geteuid() != 0 and not pids_to_show: + sys.stderr.write("Sorry, root permission required, or specify pids with -p\n") sys.stderr.close() sys.exit(1) try: - kv = kernel_ver() + kernel_ver() except (IOError, OSError): val = sys.exc_info()[1] if val.errno == errno.ENOENT: @@ -454,21 +609,34 @@ def verify_environment(): raise def main(): - split_args, pids_to_show, watch, only_total = parse_options() - verify_environment() + # Force the stdout and stderr streams to be unbuffered + sys.stdout = Unbuffered(sys.stdout) + sys.stderr = Unbuffered(sys.stderr) + + split_args, pids_to_show, watch, only_total, discriminate_by_pid, \ + show_swap = parse_options() + + verify_environment(pids_to_show) if not only_total: - print_header() + print_header(show_swap, discriminate_by_pid) if watch is not None: try: sorted_cmds = True while sorted_cmds: - sorted_cmds, shareds, count, total = get_memory_usage( pids_to_show, split_args ) - if only_total and have_pss: + sorted_cmds, shareds, count, total, swaps, total_swap = \ + get_memory_usage(pids_to_show, split_args, + discriminate_by_pid) + if only_total and show_swap and have_swap_pss: + sys.stdout.write(human(total_swap, units=1)+'\n') + elif only_total and not show_swap and have_pss: sys.stdout.write(human(total, units=1)+'\n') elif not only_total: - print_memory_usage(sorted_cmds, shareds, count, total) + print_memory_usage(sorted_cmds, shareds, count, total, + swaps, total_swap, show_swap) + + sys.stdout.flush() time.sleep(watch) else: sys.stdout.write('Process does not exist anymore.\n') @@ -476,18 +644,23 @@ def main(): pass else: # This is the default behavior - sorted_cmds, shareds, count, total = get_memory_usage( pids_to_show, split_args ) - if only_total and have_pss: + sorted_cmds, shareds, count, total, swaps, total_swap = \ + get_memory_usage(pids_to_show, split_args, + discriminate_by_pid) + if only_total and show_swap and have_swap_pss: + sys.stdout.write(human(total_swap, units=1)+'\n') + elif only_total and not show_swap and have_pss: sys.stdout.write(human(total, units=1)+'\n') elif not only_total: - print_memory_usage(sorted_cmds, shareds, count, total) + print_memory_usage(sorted_cmds, shareds, count, total, swaps, + total_swap, show_swap) # We must close explicitly, so that any EPIPE exception # is handled by our excepthook, rather than the default # one which is reenabled after this script finishes. sys.stdout.close() - vm_accuracy = shared_val_accuracy() - show_shared_val_accuracy( vm_accuracy, only_total ) + ram_accuracy, swap_accuracy = val_accuracy( show_swap ) + show_val_accuracy( ram_accuracy, swap_accuracy, only_total, show_swap ) if __name__ == '__main__': main() diff --git a/ps_mem.spec b/ps_mem.spec index 2aa178a..dceb27c 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem -Version: 3.6 -Release: 15%{?dist} +Version: 3.14 +Release: 1%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Mon Jul 11 2022 Pádraig Brady - 3.14-1 +- Latest upstream + * Fri Jan 21 2022 Fedora Release Engineering - 3.6-15 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild From c93e4e59bf0309fd97fcfcf3a5fc0bf0f79da196 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 22 Jul 2022 15:31:05 +0000 Subject: [PATCH 12/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index dceb27c..a59c95f 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 22 2022 Fedora Release Engineering - 3.14-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Mon Jul 11 2022 Pádraig Brady - 3.14-1 - Latest upstream From d044a2d9e74d8fbbabba0548681ca4ab7bfa7233 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 20 Jan 2023 10:22:58 +0000 Subject: [PATCH 13/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index a59c95f..bc63042 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Memory profiling tool License: LGPLv2 URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jan 20 2023 Fedora Release Engineering - 3.14-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Fri Jul 22 2022 Fedora Release Engineering - 3.14-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild From ef261dc21002ea09158b5e31968b70e552178740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?= Date: Mon, 24 Apr 2023 14:54:04 +0200 Subject: [PATCH 14/22] migrate to SPDX license format --- ps_mem.spec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ps_mem.spec b/ps_mem.spec index bc63042..dd5cd2e 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,9 +1,9 @@ Name: ps_mem Version: 3.14 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Memory profiling tool -License: LGPLv2 +License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem Source0: https://raw.githubusercontent.com/pixelb/ps_mem/c80287d/ps_mem.py @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Mon Apr 24 2023 Lukáš Zaoral - 3.14-4 +- migrate to SPDX license format + * Fri Jan 20 2023 Fedora Release Engineering - 3.14-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild From 6791b62906edd477040c3d16a3533dca3e2149e8 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 21 Jul 2023 06:24:10 +0000 Subject: [PATCH 15/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index dd5cd2e..39eb79f 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 4%{?dist} +Release: 5%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 21 2023 Fedora Release Engineering - 3.14-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Mon Apr 24 2023 Lukáš Zaoral - 3.14-4 - migrate to SPDX license format From a3c0d9f999ab9c8663640077aebe18d11b0c17ef Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sun, 21 Jan 2024 22:27:55 +0000 Subject: [PATCH 16/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 39eb79f..3a96f74 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 5%{?dist} +Release: 6%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Sun Jan 21 2024 Fedora Release Engineering - 3.14-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Fri Jul 21 2023 Fedora Release Engineering - 3.14-5 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From 13e5a89f6aa1ef84708c5985ebb7eccb7865d897 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 26 Jan 2024 00:14:33 +0000 Subject: [PATCH 17/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 3a96f74..21ba2ad 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 6%{?dist} +Release: 7%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jan 26 2024 Fedora Release Engineering - 3.14-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Sun Jan 21 2024 Fedora Release Engineering - 3.14-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 8a3182caa5c70ccf0a41b23a036a7cb53490f860 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 19 Jul 2024 08:36:23 +0000 Subject: [PATCH 18/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 21ba2ad..a613ed0 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 7%{?dist} +Release: 8%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 19 2024 Fedora Release Engineering - 3.14-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Fri Jan 26 2024 Fedora Release Engineering - 3.14-7 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 4badc47f27327597ebc7334d061eb8f4c1ae7bab Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 18 Jan 2025 10:56:06 +0000 Subject: [PATCH 19/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index a613ed0..409bf6e 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 8%{?dist} +Release: 9%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Sat Jan 18 2025 Fedora Release Engineering - 3.14-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Fri Jul 19 2024 Fedora Release Engineering - 3.14-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild From 949a401aec52cb485bc85cff7321c35a234c04b4 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 25 Jul 2025 06:12:40 +0000 Subject: [PATCH 20/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 409bf6e..a55f8ae 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 9%{?dist} +Release: 10%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Fri Jul 25 2025 Fedora Release Engineering - 3.14-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Sat Jan 18 2025 Fedora Release Engineering - 3.14-9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild From 8818c9b0c16b284884776b08f38ea43bbef6b89e Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 17 Jan 2026 05:49:42 +0000 Subject: [PATCH 21/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index a55f8ae..0fc95e3 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 10%{?dist} +Release: 11%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Sat Jan 17 2026 Fedora Release Engineering - 3.14-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild + * Fri Jul 25 2025 Fedora Release Engineering - 3.14-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild From 78b60dc56d628cdbc97cd2e6c1f1c8a12757dcf4 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 16 Jul 2026 17:44:30 +0000 Subject: [PATCH 22/22] Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild --- ps_mem.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ps_mem.spec b/ps_mem.spec index 0fc95e3..389294f 100644 --- a/ps_mem.spec +++ b/ps_mem.spec @@ -1,7 +1,7 @@ Name: ps_mem Version: 3.14 -Release: 11%{?dist} +Release: 12%{?dist} Summary: Memory profiling tool License: LGPL-2.1-only URL: https://github.com/pixelb/ps_mem @@ -46,6 +46,9 @@ install -Dpm644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 %changelog +* Thu Jul 16 2026 Fedora Release Engineering - 3.14-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild + * Sat Jan 17 2026 Fedora Release Engineering - 3.14-11 - Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild