一段时间后Python挂起,按下时继续[Enter]

时间:2018-06-18 12:17:57

标签: python powershell

我制作了一个python脚本,每2秒打印并记录一个特定进程的CPU%和内存使用情况。

工作得很好。直到我休息一下。 (一小时后)当我再次检查时,python脚本暂停(或挂起)。当我按下[Enter]时,它像往常一样重新开始执行。该脚本工作正常1小时。然后日志和输出丢失了1小时30分钟而不是再次正常工作。

暂停的原因是什么??

我该如何预防呢?

重要说明:

  • 我正在使用RDP(远程桌面)工作。但是一小时后连接仍然正常运行。
  • VM属于操作系统: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

设置: enter image description here

1 个答案:

答案 0 :(得分:4)

我使用以下最小示例重现您的问题:

{
  "name": "projects/845311733624/locations/asia-east1/operations/xxxxxxxx",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoProgress",
    "annotationProgress": [{
        "progressPercent": 100,
        "startTime": "2020-05-01T06:33:53.432223Z",
        "updateTime": "2020-05-01T06:34:00.047119Z",
        "feature": "LABEL_DETECTION"
      },
      {
        "progressPercent": 100,
        "startTime": "2020-05-01T06:33:53.432223Z",
        "updateTime": "2020-05-01T06:37:37.157356Z",
        "feature": "SPEECH_TRANSCRIPTION"
      }
    ]
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.videointelligence.v1.AnnotateVideoResponse",
    "annotationResults": [{
        "segment": {
          "startTimeOffset": "0s",
          "endTimeOffset": "4s"
        }
      },
      {
        "error": {
          "code": 15,
          "message": "Calculator failed, commonly caused by invalid video, or unsupported format, or file not found, or permission denied."
        }
      }
    ]
  }
}

它仅每两秒打印一次时间。我使用以下命令从cmd运行了该脚本:

import time
while True:
    print(time.ctime())
    time.sleep(2)

停止脚本的唯一方法是,当我单击控制台并进入“选择”模式以突出显示并从中复制文本时。因此,也许您在休息时不小心单击了cmd。您可以通过仅重定向输出来防止该行为。在cmd中使用它:

python test.py

或在PowerShell中

python test.py > out.log 2> err.log

重定向输出和错误流。这样调用python,进入选择模式将不再暂停脚本的执行。在这两个控制台中,您仍然可以随时通过按CTRL + C来终止脚本(因此,它不是后台进程,这也是解决方案)。