2016-07-24 118 views
1

我試圖用exec命令是這樣來執行使用PHP Python腳本的過程中不會死:Python腳本是從內部殺死,但

exec("python /address/to/script.py"); 

我不需要腳本運行到完成,所以在它做了我所需要的之後,我從其中調用sys.exit()。執行被傳遞迴php腳本,這很好,但是python進程仍在運行。我可以在我的服務器進程列表中看到它。是否還有更多需要完全殺死它?

附加信息

  • 的Python腳本編寫第三方。

  • 我對python知之甚少,剛夠添加sys.exit()調用。

回答

0

腳本仍然可以執行一些清理代碼,或者你可以從孩子的過程,基本上將調用thread.exit()被調用sys.exit(),留下父進程的運行。

檢查sys.exit()調用是否在腳本的主要部分,並且沒有錯誤處理干擾SystemExit例外,或者您可以嘗試os._exit()。還要確保在傳遞到exec()的命令中不存在與號(&),因爲這會導致腳本作爲後臺進程運行。

注意os._exit()是不利的,因爲它不做任何清理,並基本上立即結束該過程。

編輯要從try塊內結束腳本,你可以做這樣的事情:

try: 
    # Existing Code 
except SysExit: 
    os._exit() # quit the process 
except: 
    # Existing error handling 

理想情況下,應用程序邏輯應利用消息傳遞或類似的東西,使一個子線程可以通知它應該終止的主線程。

+0

不,&不存在。我需要同步執行它。有沒有辦法在腳本中確定我是否在子進程中?我知道如何打印輸出。無論如何,os._exit()聽起來應該沒問題。至於清理,你只是指程序特定的東西?如果我每次都強行重複殺死腳本,服務器狀態應該不受影響,對吧? – DaiBu

+0

有一些技術來檢查子進程是否正在運行[here](http://stackoverflow.com/questions/23442651/check-if-the-main-thread-is-still-alive-from-another-thread)你可以試試。清理將是程序特定的東西,沖洗緩衝區等,儘管它不應該影響服務器狀態。這與通過終端中的'kill'命令終止進程沒有什麼不同。 –

+0

嗯,我嘗試使用'os._exit()',它似乎在他們的腳本中觸發異常處理。仍然不死,只是輸出一個消息到終端。但是我在主文件(文件「sys.exit()」)中找到了'search_thread = Thread()'和'search_thread.start()'調用來運行搜索循環,所以它可能是子線程)。有沒有簡單的方法向父母發送通知並在那裏殺死它? – DaiBu