goo blog サービス終了のお知らせ 

日々適当

hibitekitou

プロセス監視

mac |2023-10-17

せっかく書いたスクリプトだけど要らなくなったので供養です。
事情としては、あるプロセスがちょっとその動作はどうなの?っていうメモリの消費の仕方をしていて、それを記録するために数秒置きにそのプロセスのメモリ使用量を記録したかった、ってのがありました。んが、どうもそのプロセスはIntel版でのみ起動してくるものらしくApple Silicon版には存在しないらしいことがわかり、Intel Mac環境が急速になくなっている状況下では意味がない取り組みということが判明しまして、なのでスクリプトをゴミ箱に捨てる前に供養しようかなというわけです。

以下のスクリプトが使用しているモジュールのうち、psutilは別途入れないとダメみたいです。topコマンドで取得したリストの何列目の値が監視したいものかは、もしかしたら環境によって違うかもしれません。スクリプト内の変数memColNumが適切な値になるように要調整ですw

import psutil
import subprocess
from subprocess import PIPE
import re
import datetime
import signal
import time
import os

#デスクトップのLogフォルダに記録を保存する
logFilePath = os.path.join( os.environ['HOME'] , "Desktop" , "Log" )
#監視するプロスセス名を記入(スペースはバックスラッシュでエスケープする)
#topコマンドで捕捉されるプロセス名じゃないとダメ。
#ちなみにAdobe Crash Processorが入っているのはスペースの入ったプロセス名を
#扱うための例として使っているだけで、このアプリにメモリ使用量に関する罪はありません。
processName = "Adobe\ Crash\ Proc"
cnt = 0
outPutInfo = []
memColNum = len( processName.split() ) + 7

def check(arg1, arg2):
	global logFilePath, cnt, outPutInfo , memColNum
	cmd = "top -l 1 | grep " + processName + "| awk '{print $" + str(memColNum) + "}'"
	proc = subprocess.run( cmd , shell=True, stdout=PIPE, stderr=PIPE, text=True )
	try:
		if proc.returncode == 0:
			infoArr = ['','']
			privateMem = proc.stdout[:-1]
			if privateMem[-1] == "K":
				privateMem = str( float( privateMem[:-1] ) / 1048576 )
			if privateMem[-1] == "M":
				privateMem = str( float( privateMem[:-1] ) / 1024 )
			elif privateMem[-1] == "G":
				privateMem = privateMem[:-1]
			
			dt_now = datetime.datetime.now().strftime('%H:%M:%S')
			infoArr = [ dt_now , privateMem ]
			
			outPutInfo.append( infoArr )
			cnt += 1
			print( cnt , infoArr )
				
			if cnt > 720:
				outStr = ""
				tmpArr = dt_now.split(":")
				fileName = '-'.join( tmpArr )
				for i in range( len( outPutInfo ) ):
					outStr += ( outPutInfo[i][0] + ',' + outPutInfo[i][1] + '\n')
				with open( os.path.join( logFilePath, fileName + '.txt' ), mode='w' ) as f:
					f.write( outStr )
				cnt = 0
				outPutInfo = []
	except:
		print(processName + " is Dead")
	
def main():
	signal.signal(signal.SIGALRM, check)
	signal.setitimer(signal.ITIMER_REAL, 0.1, 5.0)
	while True:
		time.sleep(1)
			
if __name__ == '__main__':
	main()
コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。