iT邦幫忙

0

python編譯後的程式無故自動關閉

先前使用python寫了程式後用PyInstaller編譯成exe
內容主要是使用while監看另一部機器的狀態
不過啟動後約2天左右會沒有報錯就默默的關閉
請問這可能是哪方面有問題呢?
python版本為3.8.4
PyInstaller版本為3.6

ccutmis iT邦高手 4 級 ‧ 2021-01-11 10:01:07 檢舉
你有試過再寫一個程式交互監控嗎
舉個例子 你現在寫了程式A 功用是監看另一部機器
現在多加一個程式B 每當時間的分鐘是7的倍數時就偵測程式A是不是活著 如果已經不在 就重新執行程式A
同時程式A也加入一個功能 就是在它開始執行的時候同時讓B執行 並且每當時間的分鐘數是11的時候就偵測B是不是活著 如果已經不在 就重新執行程式B

這樣的方法夠土法煉鋼了吧ㄎㄎ

不然就是在程式加上error log或event log的功能 記錄他到什麼時間中斷log或是error時的錯誤是什麼 沈默不代表沒報錯
a500197 iT邦新手 5 級 ‧ 2021-01-11 10:32:52 檢舉
有想過這個方法
或者固定讓他多久重開一次
理論上可以治標
但更想知道為何會發生
error log部分有寫不過沒發出錯誤才說沒報錯
中斷log其實也有但關閉時間是稍微浮動的所以只說明大約
ccutmis iT邦高手 4 級 ‧ 2021-01-11 10:52:21 檢舉
你只講大概的情況就更難判斷了(除非回答的人能通靈)
比方講如果是OS自己隔一天時間重新開機的情況(但是程式A沒有對應的機制)
或是其它你原先沒預料的情況發生
以傳統武術點到為止來說 治標的方法若能解決問題 就是好方法
用上面的例子來說程式AB交互監控寫好 再加上一個開機就會啟動程式A 這樣就算OS自動重開機它也能正常運作 不然遇到一個OS在背景更新完自己重關機的狀況就GG了
0
ccutmis
iT邦高手 4 級 ‧ 2021-01-11 11:01:19

這邊分享一個我個人愛用的error log方式(使用traceback模組)給樓主參考:

from traceback import extract_tb
from sys import exc_info,exit
from datetime import datetime

if __name__ == "__main__":
    try:
        #這裡放入程式碼
        QWERASDFQWERASDF
    except Exception as e:
        error_class = e.__class__.__name__ #取得錯誤類型
        detail = e.args[0] #取得詳細內容
        cl, exc, tb = exc_info() #取得Call Stack
        lastCallStack = extract_tb(tb)[-1] #取得Call Stack的最後一筆資料
        fileName = lastCallStack[0] #取得發生的檔案名稱
        lineNum = lastCallStack[1] #取得發生的行號
        funcName = lastCallStack[2] #取得發生的函數名稱
        errMsg = "File \"{}\", line {}, in {}: [{}] {}".format(fileName, lineNum, funcName, error_class, detail)
        with open('runtime_error.log','a+',encoding='utf-8') as f:
            f.writelines(datetime.now().strftime("%Y-%m-%d %H:%M:%S")+'\t'+errMsg+'\n')
        print(errMsg)
        exit(0)

以上面的例子來說直接執行它會將錯誤內容記錄到runtime_reeor.log,內容如下:

2021-01-11 10:55:32	File "C:\Users\demo\err_report_demo.py", line 8, in <module>: [NameError] name 'QWERASDFQWERASDF' is not defined

我故意寫了QWERASDFQWERASDF 在裡面讓它出錯。

a500197 iT邦新手 5 級 ‧ 2021-01-11 11:37:31 檢舉

我也是用這個
不過沒有記錄所以才有此疑惑

ccutmis iT邦高手 4 級 ‧ 2021-01-11 12:15:55 檢舉

那可能是跟程式本身沒關係的情況發生 例如我提過的OS自行重啟 程式本身並沒有出錯 當然也就不會有出錯的記錄

2

你的問題真的是需要通靈才有辦法找。

一般可以先從事件記錄那邊先查原因。
畢竟你是exe,所以還可以推測是跑在windows系統才對。

以下列幾個可能性讓你去查看。

1.作業系統本身的問題:
一般這是run在windows「非server」系列才容易發生,認真來說。這一直是windows系統的通病。
因為這在其它的exe也是會發生的。

2.程式內有不正常的變數記憶方式,或變數資源累加未正常釋放掉
這可能你先追蹤一天看看,先注意該應用的記憶體使用量。會不會一直持續增加。
因為記憶用量到程式崩潰的可能性還是會有的。

3.安全因素?
這是很早期曾經碰過的。但這個不好說明,就先跳過了。

一般會建議長期跑的東西,最好還是註冊成服務的應用。
會比較安全不怕被中斷。
如果不會的話,也可以利用一下計劃任務來幫你做安全檢測重啟處理。

a500197 iT邦新手 5 級 ‧ 2021-01-11 11:41:54 檢舉

目前大概排除1
因為確實是在SERVER上跑的
版本為2012R2
不知是否有關連

目前會往2的方向追查看看
也會研究一下註冊成服務的可行性
感謝大大的可能方向

0
japhenchen
iT邦大師 1 級 ‧ 2021-01-11 11:51:41

盯一下是不是有MemoryLeak的問題,打開工作管理員,跑個半天看看,看記憶體是不是愈吃愈兇,如果有而你不想改或不知怎麼下手,可以讓程式重新啟動自己

os.system(r'yourpy.exe')
#結束目前的程式
看更多先前的回應...收起先前的回應...
a500197 iT邦新手 5 級 ‧ 2021-01-11 13:33:38 檢舉

目前正在觀察中

另外想請問您所PO之os.system(r'yourpy.exe')僅關閉當前程式嗎?
若是那與os._exit(0)效果是否相同呢?

如果你不需要回傳值給OS的話,用return 也行

a500197 iT邦新手 5 級 ‧ 2021-01-11 13:46:26 檢舉

了解
誤會其可以重啟自己
想說一行搞定好強大

只是另外啟動一個程式且把自己關閉而已,其實重啟自己也只是這樣用而已,沒什麼花招

我要發表回答

立即登入回答