2011-06-28 29 views
2

我對我的腳本有一些困難。目的是啓動一個或多個OpenVZ容器來執行一些測試。那些測試可能很長(通常約3小時)。我懷疑Popen超時沒有說

第一個劇本要這樣,排序隊列成員推出後,它的作用:

subprocess.Popen(QUEUE_EXECUTER % queue['queue_id'], shell=True)

其中「QUEUE_EXECUTER%隊列[‘queue_id’]」是完整的命令來運行。在queue_executer腳本它會是這樣的:

# Launching install 
cmd = queue['cmd_install'] 
report_install = open(queue['report_install'], 'a') 
process_install = subprocess.Popen(cmd, shell=True, stdout=report_install, stderr=subprocess.STDOUT) 
process_install.wait() 

# Launching test 
logger.debug('Launching test') 
report_test = open(queue['report_test'], 'a') 
cmd = queue['cmd_test'] 
process_test = subprocess.Popen(cmd, shell=True, stdout=report_test, stderr=subprocess.STDOUT) 
process_test.wait() 

它工作的很好,但過一段時間,最近,大部分的時間,停止執行。沒有錯誤的日誌或任何東西。報告文件顯示它在一行的寫入過程中停止(我相信這是因爲該文件在python一側沒有正確關閉)。 在主機端,OOM殺手似乎沒有做任何事情,並且我搜索了主機的日誌而沒有發現任何東西。

上面推出的兩個「cmd」是基本上設置了vz的shell腳本,並在其上執行測試程序。

所以我的一個大問題是:我是否錯過了一些會導致腳本停止在Python端的東西?

謝謝。

編輯:一些補充信息。

失敗的命令總是第二個。下面是命令的兩個示例值我試圖執行:/path/vzspawncluster.sh /tmp/file web --tarball /services/pkgs/etch/releases/archive.tar.gz --create/path/vzlaunch.sh 172 -b trunk --args "-a -v -s --time --cluster --sql=qa3 --queue=223 --html [email protected]"

的vzlaunch腳本啓動與vzctl enter ID /path/script.py一個OpenVZ的容器,其中ID是容器ID的python腳本和/path/script.py的腳本容器。

機器report_install和report_test是位於通過NFS共享訪問的另一臺計算機上的文件。這應該不重要,但由於我真的不知道失敗時發生了什麼,我仍然注意到它。

當它失敗時,容器上的進程死亡。它並不處於任何殭屍狀態或任何其他狀態,它只是死了。雖然容器上的進程失敗,但主進程(將所有進程啓動的進程)仍然繼續,好像一切都很好。

一些更多的信息: 我試過buffer-flushing approach通過SMCI指出,但我的日誌文件的寫作不斷被一條線的中間偏右的切割:

[18:55:27][Scripteo]  Create process '/QA/valideo.trunk/tests/756/test.py -i 10.1.11.122 --report --verbose --name 756 --... 
[18:56:35][Scripteo]  Create process '/QA/valideo.trunk/tests/762/test.py -i 10.1.11.122 --report --verbose --name 762 --... 
[18:57:56][Scripteo]  Create process '/QA/valideo.trunk/tests/764/test.py -i 10.1.11.122 --report --verbose --name 764 --... 
[18:59:27][Scripteo]  Create process '/QA/valideo.trunk/tests/789/test.py -i 10.1.11.122 --report --verbose --name 789 --... 
[19:00:44][Scripteo]  Create process '/QA/valideo.trunk/tests/866/test.py -i 10.1.11.122 --report --verbose --name 866 --... 
[19:02:27][Scripteo]  Create process '/QA/valideo.trunk/tests/867/test.py -i 10.1.11.122 --report --verbose --name 867 --... 
[19:04:13][Scripteo]  Create process '/QA/valideo.trunk/tests/874/t 
+0

你是什麼意思_'The機report_install意味着和report_test位於不同的機器上的文件通過NFS共享訪問.'_你的意思是_files_在不同的機器,或_jobs_,或兩者兼而有之?你的意思是兩個作業在不同的機器上並行運行?爲什麼不在已知好的機器上運行這兩項工作?或者先嚐試運行失敗的人?我不清楚這兩個容器是否相互依賴。 – smci

+1

我的腳本並不是唯一能夠產生這種類型的報告的人,這就是爲什麼他們通過NFS共享集中在遠程計算機上的原因。 (只有文件位於那裏,作業在本地機器上運行,通過遠程機器上的網絡寫入)。我把所有的日誌都移到了本地目錄,它似乎不再崩潰。儘管我只是治癒了sympthomes,但我仍然有這種感覺,但問題仍然存在。無論如何,感謝您的幫助! – jaes

+0

好的,我建議你在OpenVZ上提交一個bug。 – smci

回答

0

你的意圖是先運行process_install直到完成,然後運行process_wait? (按順序,不是多處理,對吧?)你懷疑哪個命令超時?

,請複製粘貼的queue['cmd_install'], queue['cmd_test']

(實際值會那樣做這些命令有一個尾隨「&」或重定向?)

這裏是我的調試建議:

  • (我不知道OpenVZ的,但我想你已經檢查了日誌,以及是否允許運行在退出命令)

  • 你在UNIX上運行嗎?如果是這樣,你可以在後臺運行命令來運行cmd,並運行一個循環來生成輸出,例如一會兒(1)觸摸哨兵文件然後睡10s。或者你可以cmd; touch donesentinel

  • 嘗試添加一個輪詢循環來輪詢每個時間間隔內的每個Popen對象,而不是wait()。

  • 或者,在啓動後打印Popen.pid,然後從外部檢查或輪詢該進程仍然存在(例如,使用UNIX top -p)。

  • 如果您的過程生成lotta輸出,您注意到the caveat on Popen.wait()Warning: This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

  • 如果您懷疑發生了這種情況,請重定向stdout, stderr to os.devnull,並查看您的結果是否有差異。或看到這buffer-flushing approach

+0

嗨,謝謝你的支持。 我會添加信息到我的主要職位,但在這裏我已經可以說我通過各種日誌,容器和主機搜索,但沒有發現任何東西。 我研究了啓動的腳本的每種方式都可能導致文件描述符打開或以某種方式填充緩衝區,這會導致腳本停止,但再次發現任何內容。 在同事的建議下,我試着用「python -u」來執行腳本,它禁止python緩衝任何內容,但這並不會改變任何內容。 我會試着改變我等待劇本結束的方式,因爲你建議我。 – jaes