我已经有一个shell脚本可以确定哪个进程正在使用swap和多少,但我宁愿在python中执行此操作。
Shell one-liner(我在网上发现了这个脚本,但不记得它的来源):
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done| sort -k 2 -n
上面的脚本基本上通过/ proc查看并获取进程名称,PID和它使用的交换空间。
就python而言,来自psutil的memory_maps()看起来很有希望,但我找不到输出指定进程名称或PID的位置。
我想做什么?我正在尝试重写一堆旧的shell脚本,它们将CPU,内存,交换,使用等内容收集到一个大的python程序中。我知道我可以使用subprocess或shellexec调用这些脚本,但我想尽可能地避免这种情况。
我在问什么?有一个更好的方法吗?我的方法都错了吗?
编辑:
我在python3上取得了一些进展。这是我的代码。
#!/usr/bin/python3
import re
import glob
class searchfile:
def __init__(self, file, searchstring1, searchstring2, searchstring3, searchstring4 ):
self.file = file
self.searchstring1 = searchstring1
self.searchstring2 = searchstring2
self.searchstring3 = searchstring3
self.searchstring4 = searchstring4
class searchparm(searchfile):
def printsearch(self):
hand = open(self.file)
for line in hand:
line = line.rstrip()
if re.search(self.searchstring1, line):
print (line)
if re.search(self.searchstring2, line):
print (line)
if re.search(self.searchstring3, line):
print (line)
if re.search(self.searchstring4, line):
print (line)
for file in glob.glob('/proc/*/status'):
search_proc = searchparm(file, 'Name', 'VmSwap', 'Pid:', 'VmSize:' )
print("#########################################")
print("#########################################")
print(search_proc.printsearch())
答案 0 :(得分:0)
memory_maps()
只是内存映射指定进程的函数(不适用于每个进程)。
让我们从头开始 - psutil提供了一个pids()
方法,列出了当前正在运行的所有进程,然后您必须创建一个Process
对象,以便您访问内存和其他有关该特定流程的指标。例如,您可以编写print psutil.Process().memory_maps()
来获取当前Python进程的内存映射(如果没有给出PID,则默认为正在运行的进程)。
以下是一个示例,说明如何使用psutil
获取与shell脚本相同的交换数据(请注意,您需要以root身份运行Python以获取有关系统进程的信息):
for p in psutil.process_iter(): # quicker way to iterate
print p.pid, p.name(), p.memory_full_info().swap
示例输出:
...
669 kvm-irqfd-clean 0
731 systemd-timesyncd 475136
827 rpcbind 901120
837 ModemManager 3784704
846 thermald 983040
851 cron 409600
854 systemd-logind 647168
855 acpid 327680
859 avahi-daemon 413696
860 dbus-daemon 2416640
873 avahi-daemon 569344
879 NetworkManager 3088384
...
完整文档位于psutil的Process类中。