2016-06-07 2 views
1

이미 스왑을 사용하는 프로세스와 얼마만큼의 프로세스를 결정할 수있는 쉘 스크립트가 있지만 파이썬에서이 작업을 수행합니다. 스왑 사용. Python 버전

쉘 한 줄

(I 웹에서이 스크립트를 찾았지만 그것을 기억할 수는 원점) :

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

기본적으로 위의 스크립트는/proc 디렉토리를 통해보고 얼마나 많은 스왑 프로세스 이름, PID 및 도착 사용하는 공간.

파이썬에 관한 한 psutil의 memory_maps()는 유망 해 보이지만 출력에서 ​​프로세스 이름이나 PID를 지정하는 곳을 찾을 수 없습니다.

나는 무엇을하려고합니까? CPU, 메모리, 스왑, 사용법 등을 하나의 큰 파이썬 프로그램으로 모으는 오래된 쉘 스크립트를 다시 작성하려고합니다. 나는이 스크립트를 하위 프로세스 또는 shellexec을 사용하여 호출 할 수 있음을 알고 있지만 최대한 많이 피하고 싶습니다.

내가 뭘 물어 보는거야? 이 작업을 수행하는 더 좋은 방법이 있습니까? 내 접근 방식이 틀렸어?

편집 :

나는 python3을 통해 약간의 진전을 이루었습니다. 여기 내 코드가있다. psutil에

#!/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'를 읽을 수 있습니다. – Barmar

답변

0

memory_maps() 메모리에만 함수 (되지 모든 프로세스에 대해) 특정 처리를 맵이다.

처음부터 시작해 보겠습니다. psutil은 현재 실행중인 모든 프로세스를 나열하는 pids() 메서드를 제공하므로 특정 프로세스에 대한 메모리 및 기타 메트릭에 액세스 할 수있는 Process 개체를 만들어야합니다. 예를 들어 print psutil.Process().memory_maps()을 작성하면 현재 파이썬 프로세스의 메모리 맵을 얻을 수 있습니다 (PID가없는 경우 실행중인 프로세스가 기본값 임).

for p in psutil.process_iter(): # quicker way to iterate 
    print p.pid, p.name(), p.memory_full_info().swap 

: 여기

psutil (당신은 시스템 프로세스에 대한 정보를 얻기 위해 루트로 파이썬을 실행해야합니다 주)와 쉘 스크립트와 동일한 스왑 데이터를 얻을 수있는 방법의 예 샘플 출력 :

... 
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 클래스입니다.