2011-04-01 48 views
15

我正在編寫一個使用Selenium來屏幕刮另一個網站的Web應用程序。這種屏幕抓取只發生一次,所以我寧願不讓Selenium和Xvfb一直運行。如何在Python中使用子進程模塊啓動和停止Linux程序?

我想弄清楚如何從Python啓動Xvfb和Selenium,然後在屏幕抓取完成後停止它們。

如果我做手工,我會在命令行啓動它們,並創下CTRLÇ阻止他們。我試圖從Python做同樣的事情。

我似乎能夠成功啓動的Xvfb是這樣的:

xvfb = Popen('Xvfb :99 -nolisten tcp', shell=True) 

但是,當我試圖終止它:

xvfb.terminate() 

,然後試圖啓動它再次(通過重複我的初始命令),它告訴我它已經在運行。

+0

這得到五個upvotes?我以爲我只是非常愚蠢! – 2011-04-01 17:12:34

+0

在'xvfb.terminate()'之後嘗試'xvfb.wait()'。如果沒有,請嘗試'xvfb.kill()'。 – 2011-04-01 17:14:48

+3

Ctrl-C將SIGTERM發送到Unix進程。您的用戶python進程無法將SIGTERM發送到以root身份運行的Xvfb。得到你孩子的pid,執行「sudo kill 」,然後執行「xvfb.wait()」。 – 2011-04-01 17:15:44

回答

7

我不知道爲什麼你想以root身份運行Xvfb。您通常的X服務器只需要以root身份運行(在很多但不是全部的情況下),以便它可以訪問視頻硬件;根據定義,這對於Xvfb來說不是問題。

tempdir = tempfile.mkdtemp() 
xvfb = subprocess.Popen(['Xvfb', ':99', '-nolisten', 'tcp', '-fbdir', tempdir]) 

當你終止X服務器,你可能會看到一個zombie process。事實上,這不是一個進程(它已經死了),只是當父進程讀取子進程退出狀態或自己死掉時進程表中的一個條目消失。殭屍大多是無害的,但撥打wait來讀取退出狀態會更簡潔。

xvfb.terminate() 
# At this point, `ps -C Xvfb` may still show a running process 
# (because signal delivery is asynchronous) or a zombie. 
xvfb.wait() 
# Now the child is dead and reaped (assuming it didn't catch SIGTERM). 
+0

@Gilles:啊,gotcha - 我複製並粘貼了我用來從某個網頁啓動Xvfb的命令。我沒有意識到這是'fbdir'選項,如果我沒有以root身份運行它,它將無法正常工作。我現在已經刪除了它,並且可以像平時一樣運行它,但'.terminate()'和'.kill()'似乎並不能阻止Xvfb。 – 2011-04-01 21:27:24

+0

@Paul:我在「Popen」電話中犯了幾個錯別字,但我認爲你說得對。你確定'.terminate()'和'.kill()'沒有終止進程嗎?殭屍可能會保留(當Python腳本終止時它將消失),請參閱我的編輯。 – Gilles 2011-04-01 21:46:10

+0

@Gilles:是的,看起來這個過程是漫不經心的。在'.terminate()','.kill()'之後,當我退出Python shell後,'ps -C Xvfb'仍然報告Xvfb正在運行。當我嘗試再次啓動Xvfb時,它也表示服務器已處於活動狀態。 (我認爲這只是因爲'/ tmp/.X99-lock'文件仍然存在,但'ps -C Xvfb'確認這個過程仍在運行。) – 2011-04-01 22:41:05

1

我認爲你可以參數化系統使任何用戶推出的Xvfb作爲解釋here解決所有的問題

編輯 正確的命令行是

sudo chmod u+s `which Xvfb` 
+0

可能 - 哪個部分允許任何用戶啓動Xvfb?是'sudo mod u + s'哪個Xvfb''?我不熟悉'mod'命令,它對谷歌搜索有點免疫 - 你可以擴展它嗎? – 2011-04-01 18:12:13

+0

實際上它應該是'chmod u + s',如這裏所解釋 http://en.wikipedia.org/wiki/Chmod – 2011-04-01 18:27:30

+0

我懷疑'mod'命令存在對一個命令的幫助,只是寫'man命令' – 2011-04-01 18:43:52

相關問題