2011-08-30 26 views
4

好的,我需要編寫一個調用腳本的代碼,如果腳本中的操作掛起,則終止該流程。Linux,子流程超時

首選語言是Python,但我也在瀏覽C和bash腳本文檔。

看起來像一個簡單的問題,但我不能決定最佳的解決方案。

從迄今爲止的研究:

  • 的Python:具有這樣的虛擬機使用 一個線程在同一時間一些奇怪的線程模型,將無法正常工作? C:到目前爲止的首選解決方案似乎使用SIGALARM + fork + execl。但是SIGALARM並不安全,所以它可以破壞一切?
  • Bash:超時程序?不是所有發行版的標準?

由於我是Linux新手,我可能沒有意識到這些函數有500個不同的陷阱,所以任何人都可以告訴我什麼是最安全和最乾淨的方法?

回答

2

在bash中,你可以做一些與此類似:

  1. 在背景&
  2. 啓動腳本/程序獲得後臺進程的進程ID
  3. 睡了一段時間
  4. 然後殺死進程(如果完成了,你不能殺死它),或者你可以檢查進程是否仍然存在,然後殺死它。

例子:

sh long_time_script.sh & 
pid=$! 
sleep 30s 
kill $pid 

你甚至可以嘗試使用trap 'script_stopped $pid' SIGCHLD - 看到bash手冊獲得更多信息。

更新:我發現其他命令timeout。它完全符合你的需求 - 運行一個有時間限制的命令。例如:

timeout 10s sleep 15s 

將在10秒後終止sleep

4

避免SIGALRM,因爲在信號處理程序中沒有太多安全的事情要做。

考慮到您應該使用系統調用,在C中,執行fork-exec啓動子進程後,可以定期調用waitpid(2)WNOHANG選項來檢查子進程是否仍在運行。如果waitpid返回0(進程仍在運行)並且所需超時已過,則可以使用kill(2)子進程。

1

有一個Python代碼的集合,具有完成這個功能的功能,如果你知道這些API,沒有太多的困難。

Pycopia集合包含用於超時函數的調度程序模塊,以及用於產生子進程並向其發送信號的proctools模塊。在這種情況下可以使用kill方法。