筆者這兩天寫了一個python腳本程序,用來自動從公司的主數據系統獲取數據,并按格式編制成excel。腳本程序編寫一切順利,運行結果很是完美,筆者很是舒心。但在最后一步,用上班的電腦每天早上定時運行它時,出了點小狀況。
本想著用定時計劃應該就是幾分鐘搞定的事情,結果整了一上午沒有成功。過程中一度以為自己的電腦系統是不是有問題。。。
最終,源于筆者把定時任務設置成打開瀏覽器用于測試后,發現瀏覽器并未成功打開,而手動打開雙擊瀏覽器圖標的時候,卻提示已經在后臺運行,從而發現了問題的根源。打開任務管理器一看,好家伙,幾十個瀏覽器進程(而此時瀏覽器既未在窗口呈現、也未打開任何內容)。于是,猛然驚醒:怪不得每次的測試,“上次運行結果”都顯示“操作成功完成(0x0)”,而就是不見想要的程序運行界面——原來它在且只在后臺運行了!
找到正確的切入點,網上再搜,終于對癥下了藥。也有其他人遇到同樣問題。解決辦法很簡單:
原先筆者自作聰明,將上圖中紅框里默認的“只在用戶登錄時運行”改為了“不管用戶是否登錄都要運行”,只要改為圖中選擇“只在用戶登錄時運行”,即可解決定時任務的程序沒有正常打開界面窗口,只在后臺運行的問題。
經測試,定時任務就可以一切按照所想執行了。
為什么會這樣呢?
查了一下,覺得比較靠譜的解釋知乎上的一位叫“小豬wynn”的回答:
因為基于安全性考慮,windows系統已將用戶UI與系統服務分在不同session中,除非使用特殊的技術否則系統session無法訪問用戶UI,無論是service啟動還是任務計劃的第二個選項“不管用戶是否登錄都要運行”啟動都是運行在系統session。所以就沒法看到用戶UI了。
那么就只能在用戶登錄時才能處理自動定時任務了嗎?
這個筆者想了一下,選第二種“不管用戶是否登錄都要運行”主要為的目的就是系統用戶未登陸時的情況,那么通過第一種選擇“只在用戶登錄時運行”加上系統不睡眠,也可以這樣曲線救國的方式來解決。
而且,只有需要在前臺界面運行的工作,才會受到第二種選擇的影響,如果任務本身不需要和界面打交道,那么也就不會存在什么運行的問題了。
完畢。