我制作了一个python脚本,它每隔2秒打印并记录特定进程的CPU%和内存使用情况。
它运行得相当好。直到我去休息一下。(一个小时后)当我再次检查时,Python脚本暂停(或挂起)。当我按下[Enter]时,它像往常一样再次开始执行。剧本在1小时内运行得很好。然后,日志和输出丢失1小时30分钟,并且不能再次正常工作。
停顿的原因是什么?
我怎么才能防止它。?
重要备注:
- 我在使用RDP(远程桌面)的机器上工作。但一小时后,连接仍在正常运行。
- 虚拟机为操作系统:Windows Server 2016。
- 在命令提示符下运行该脚本。
- logger.txt没有错误。
- 我在监控Powershell.exe
- 当我监控除Powershell.exe(我用python.exe&taskmgr.exe测试过)以外的任何其他进程时,脚本不会挂起
- PowerShell进程肯定在运行。我检查了PowerShell脚本的日志,它在整个过程中都在运行。
完整代码:
import psutil
import re
import math
import traceback
from time import ctime,sleep,localtime,time
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
import sys
def logg(msg):
msg_parsed = str(ctime()) + " : " + str(msg)
with open("logger.txt","a") as ff:
ff.write("\n" + msg_parsed)
def aprint(msg, process="", counter = "" , pos=0,size=90):
def sprint(msg):
if not pos:
print(msg)
elif pos==1:
print("|" + msg[0:size] + " "*(size- (len(msg[0:size]))) + "|" + " "*size+"|")
elif pos==2:
print("|" + " "*size+"|" + msg[0:size] + " "*(size- (len(msg[0:size]))) + "|")
msg = str(ctime()) + " : " + str(process) + " : " + counter + " : " + str(msg)
sprint(msg)
if counter or process:
f = open("_".join((counter.replace(" ",""), process.replace(" ",""))) +".log", "a")
else:
f = open("perf.log", "a")
f.write(msg+"\n")
f.close()
try:
res = requests.post("https://localhost:8088/services/collector", headers={"Authorization": "Splunk 1b61f1eb-e29f-4d29-9f70-b7f88bcd5b65"}, data='{"time": %d , "index":"main","sourcetype": "FIFA:%s", "event":"%s"}' % (time(),counter,msg), verify = False)
if "Success" not in res.text:
sprint("[WARNING]")
logg(" WARNING : " + res.text)
except Exception as eee:
sprint("[ERROR]")
logg(msg + " ::: coulld not sent :::" + str(eee))
logg(traceback.print_exc())
def convert_size(size_bytes):
if size_bytes == 0:
return "0B"
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
i = int(math.floor(math.log(size_bytes, 1024)))
p = math.pow(1024, i)
s = round(size_bytes / p, 2)
return "%s %s" % (s, size_name[i])
while True:
try:
rrs =0
cpptime = 0
leave = False
matched = None
for proc in psutil.process_iter():
if re.match(sys.argv[1].lower(),proc.name().lower()):
leave = True
matched = proc.name()
rrs = max(rrs, proc.memory_info().rss)
cpptime = max(proc.cpu_percent()/psutil.cpu_count(), cpptime)
if matched:
aprint( convert_size(rrs), matched ,"Memory" , pos=1)
aprint( cpptime , matched ,"CPU", pos=2)
try:
sleep(2)
except:
break
except Exception as ee:
print(" [ERROR] : " + str(ee))
logg(ee)
logg(traceback.print_exc())
运行:python file.py <process name>
例如:python file.py python
日志文件:
Mon Jun 18 12:46:30 2018 : powershell.exe : memory : 2.29 GB
Mon Jun 18 12:46:33 2018 : powershell.exe : memory : 2.29 GB
Mon Jun 18 12:46:37 2018 : powershell.exe : memory : 2.29 GB
Mon Jun 18 12:46:40 2018 : powershell.exe : memory : 2.29 GB
Mon Jun 18 12:46:43 2018 : powershell.exe : memory : 2.29 GB
Mon Jun 18 12:46:46 2018 : powershell.exe : memory : 2.3 GB
Mon Jun 18 12:46:49 2018 : powershell.exe : memory : 2.3 GB
Mon Jun 18 12:46:53 2018 : powershell.exe : memory : 2.3 GB
Mon Jun 18 12:46:56 2018 : powershell.exe : memory : 2.3 GB
Mon Jun 18 12:46:59 2018 : powershell.exe : memory : 2.31 GB
Mon Jun 18 14:17:33 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:38 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:41 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:44 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:47 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:50 2018 : powershell.exe : memory : 3.11 GB
Mon Jun 18 14:17:53 2018 : powershell.exe : memory : 3.11 GB
设置:
1条答案
按热度按时间gpnt7bae1#
我使用了以下最小的例子来重现您的问题:
它只每两秒打印一次时间。我使用以下命令从CMD运行此脚本:
唯一停止脚本的是当我(左)点击进入控制台并进入快速编辑模式以突出显示并复制其中的文本时。所以,也许你只是在休息的时候不小心点进了CMD。您只需重定向输出即可防止这种行为。在CMD中使用此命令:
或者在PowerShell中这样做:
要同时重定向输出和错误流,请执行以下操作。像这样调用python,进入快速编辑模式不会再暂停您的脚本的执行。在这两个控制台中,您仍然可以随时按CTRL+C来终止脚本(因此它不是后台进程,这也是一种解决方案)。
您还可以禁用默认情况下启用的快速编辑模式:
1.右键单击控制台窗口的标题栏。
1.选择[属性]。
1.在[选项]选项卡中,进入[编辑选项],取消勾选[快速编辑模式]选项。