您好,登錄后才能下訂單哦!
一、需求場景:
大量的windows上運行著某任務的Java程序,程序會出現莫名卡主。卡主時候系統資源利用率都正常,程序也只是卡主不會有任何錯誤提示,往往業務出現了問題再回頭去查時候才會發現,不然就要派人定期巡檢。
二、想法:
觀察到程序卡主以后日志也停止輸出,可以定期對比日志和系統時間,超過規定的閥值視為異常,即刻重啟該程序(哎~有各種問題卻無人維護的程序還真不少,只能貼狗皮膏藥吧)
三、實踐:
# -*- coding: utf-8 -*- import os import time import datetime import subprocess from dateutil.parser import parse def error1(fun): def error2(doc): try: fun(doc) except Exception as reason: print(reason) return error2 def read_log(log_file): tag = -1 flag = True with open(log_file, 'rb') as f: lines = f.readlines() while flag: try: last_line = str(lines[tag], encoding='gb2312') print('獲取到第%s行的數據為:\n%s' % (tag, last_line)) log_time = last_line.split(",")[0] print('提取行數據中的時間為:%s' % (log_time)) time_format = time.strptime(log_time, "%Y-%m-%d %H:%M:%S") print('時間格式正確!') flag = False except Exception as reason: print(reason) tag -= 1 return log_time def contrast_time(log_time): system_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print('獲取系統時間:%s' % (system_time)) a = parse(log_time) b = parse(system_time) interval = (b - a).total_seconds() print("時間間隔為:%s秒" % (interval)) return interval def restart_script(interval, timeout, proc_name, cmd_file): current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') f = open('log.txt', 'a+') print('%s 執行重啟' % (current_time), file=f) f.close() os.system('taskkill /IM %s /F' % (proc_name)) os.system('taskkill /IM cmd.exe /F') time.sleep(1) subprocess.Popen("%s" % (cmd_file)) @error1 def main(intervals): print('檢查的文件為:%s' % (log_file)) log_time = read_log(log_file) interval = contrast_time(log_time) if interval > timeout: print("檢測到超時,將重啟腳本....") restart_script(interval, timeout, proc_name, cmd_file) else: print("檢測到時間間隔在規定范圍內") print('==============================================') time.sleep(intervals) if __name__ == '__main__': intervals = 300 timeout = 300 proc_name = 'java.exe' log_file = 'C:\\mailboxcode\\log\\log_' cmd_file = 'C:\\check_log\\start_run.bat' while True: main(intervals)
四、運行演示:
如果最后一行數據不包含時間,將會繼續往上找一行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。