I have made a python script which prints and logs CPU % and memory usage of a particular process every 2 seconds.
It was working pretty fine. Until I went for a break. (after one hour) When I check again, the python script was paused (or hung). When I pressed [Enter], it started executing again as usual. The script worked fine for 1 hour. Then the log and output were missing for 1hour 30 minutes and not it is working fine again.
What is the cause of the pause.?
How can I prevent it.?
Important Notes:
Whole code:
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())
Run : python file.py <process name>
e.g : python file.py python
Log File:
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
Settings:
I used the following minimal example to reproduce your problem:
import time
while True:
print(time.ctime())
time.sleep(2)
It just prints the time every two seconds. I ran this script from cmd using the following command:
python test.py
The only thing that stopped the script, was when I clicked into into the console and entered the "selection" mode to highlight and copy text from it. So maybe you just accidentally clicked into the cmd, when you went to your break. You can prevent that behaviour by just redirecting the output. Use this in cmd:
python test.py > out.log 2> err.log
or this in PowerShell:
Start-Process python -ArgumentList "test.py" -RedirectStandardOutput out.log -RedirectStandardError err.log -NoNewWindow -Wait
to redirect both, the output and the error stream. Calling python like that, entering the selection mode will not pause the execution of your script anymore. In both consoles, you can still terminate the script by pressing CTRL+C at any time (so it is not a background process, which would be a solution, too).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With