2016-06-07 8 views
1

У меня уже есть сценарий оболочки, который может определить, какой процесс использует swap и сколько, но я предпочел бы сделать это в python.Что использует swap. Python version

Shell один вкладыш (я нашел этот сценарий в Интернете, но не могу вспомнить его происхождение):

for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done| sort -k 2 -n 

Сценарий выше в основном смотрит через/Proc и получает имя процесса, PID и сколько подкачки пространство, которое он использует.

Что касается python, то memory_maps() от psutil выглядит многообещающим, но я не могу найти, где выходные данные указывают имя процесса или PID.

Что я пытаюсь сделать? Я пытаюсь переписать кучу старых сценариев оболочки, которые собирают такие вещи, как процессор, память, своп, использование и т. Д. В одну большую программу на питоне. Я знаю, что я могу вызывать эти скрипты с помощью подпроцесса или shellexec, но я хочу избежать этого как можно больше.

Что я спрашиваю? Есть лучший способ сделать это? Не подходит ли мой подход?

Edit:

Я сделал некоторый прогресс с 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

Вы можете прочитать '/ proc//status' из Python. – Barmar

ответ

0

memory_maps() в psutil является функцией только в памяти карту указанного процесса (не для каждого процесса).

Начнем с начала - psutil предоставляет метод pids(), в котором перечислены все процессы, выполняемые в настоящее время, и вам необходимо создать объект Process, который позволяет вам получать доступ к памяти и другим метрикам об этом конкретном процессе. Так, например, вы можете написать print psutil.Process().memory_maps(), чтобы получить карту памяти для текущего процесса Python (по умолчанию он работает, если не указан PID).

Вот пример того, как вы могли бы получить те же данные, своп, как и ваш сценарий оболочки с psutil (обратите внимание, что вам нужно запустить 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 
... 

полная документация находится в Process классе для psutil.

Смежные вопросы