我們目前有一個自動化系統,作爲處理衛星圖像的服務運行。該服務維護一個配置文件,在配置文件中我們應用某些腳本(python)將輸入的衛星圖像轉換爲更加可用的格式。腳本調用所需的應用程序,進行轉換。腳本本身由服務通過系統調用(「command」)(用c/C++編寫)。 (服務使用與用戶相同的帳戶)。調試Windows服務並嘗試查看它看到的內容
我們目前正在嘗試添加對另一個satelitte圖像格式的支持,該轉換器是一個來自ERDAS Imagine(importavhrr)的商業.exe(我們在腳本中執行了幾個步驟來更改投影)。
該腳本正常工作,直到它擊中的:
argslist = ['importavhrr.exe', '-in', '%s' % infn, '-out', '%s' % tmpimg1, '-gui', 'FALSE', '-correct', '-flyingheight', '833', '-rect', 'gcp', gcpfn]
print "".join(argslist)
p = subprocess.Popen(argslist, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
print str(p.communicate())
什麼結束了,現在正在發生的事情,importavhrr.exe只是坐在那裏,什麼也不做(它坐在那裏,用0 CPU使用率根據任務管理器,並且內存使用永不改變)。就好像它在等待某種用戶輸入。 (嘗試os.system,os.spawnv都產生相同的結果)我猜測某種GUI元素是以太彈出一個gui窗口的種類。從任務管理器關閉進程,將控制權返回給python。
注意:-gui FALSE/false/0參數應該防止gui彈出。但是如果數據不好(我通過破壞數據手動測試並通過腳本調用),會彈出一個錯誤窗口,顯示結果。
當我手動運行腳本(相同的文件,相同的工作目錄),它工作正常....腳本甚至工作時,我手動調用它使用相同的系統功能(其內部庫的一部分)作爲服務。
此外,使服務僅調用importavhrr.exe和環境變量的批處理文件也會導致importavhrr.exe掛起。
服務斜向: - 使用相同的用戶帳戶作爲一個我在登錄時 - - Python腳本設置30-40 envrioment變量ERDAS - 所有的環境變量設置正確(傾銷的環境變量時該腳本首先運行,並將它們與我打印郵件時得到的結果進行比較) - 將環境變量傳遞到子過程.Popen()產生相同的結果 - 公司拒絕幫助我們,因爲他們不支持從命令行運行程序(但是當用戶使用它時,它可以正常工作,而不是服務) - 在調試模式下運行服務可以正常工作。 - 我已重新啓動機器。
我不知所措,我想(和恐懼),ERDAS可執行文件正在製作某種錯誤消息窗口彈出窗口,但是我看了看,並且找不到任何方式來查看什麼服務看到。我一直試圖弄清楚這個問題已經有將近一週了,所以是的。
編輯
我抓起推薦的Process Explorer,並在堆棧線程找我有這樣的:
<snip ntoskrnl calls>
ntdll.dll!KiFastSystemCallRet
ntdll.dll!RtlSetLastWin32ErrorAndNtStatusFromNtStatus+0x301
kernel32.dll!GetModuleHandleA+0xdf
等待幾分鐘後,它變成這樣:
<snip ntoskrnl calls>
ntdll.dll!KiFastSystemCallRet
USER32.dll!ScrollWindowEx+0x121d
USER32.dll!SoftModalMessageBox+0x6f8
USER32.dll!MessageBoxTimeoutW+0x1d9
USER32.dll!MessageBoxTimeoutW+0x5b
USER32.dll!MessageBoxTimeoutA+0x9c
USER32.dll!MessageBoxExA+0x1b
USER32.dll!MessageBoxA+0x45
elib.dll!esmg_GetLocalTapesDB+0x23b
elib.dll!esmg_LogMessageFunc+0x13a
好吧,它試圖展示一個窗口,我認爲。我不知道他們的行爲,看看有什麼可能導致esmg_LogMessageFunc崩潰。該功能是他們的開發工具的一部分,我有0訪問權限。此外,我從來沒有見過erdas記錄任何東西。
你說在調試模式下運行服務工作正常。這是否意味着作爲服務運行的調試版本(即在SCM下,而不是作爲獨立程序)不會觸發問題? – 2010-10-09 17:40:34
通過調試模式我的意思是使用調試開關的服務。這基本上運行該服務作爲一個普通的exe。 – UberJumper 2010-10-12 11:29:23