2012-12-06 59 views
2

我使用libreoffice/openoffice作爲無頭過程來處理我通過unoconv「提交」的服務器上的一些文檔轉換任務。偶爾,實際上做這個工作的過程soffice.bin似乎被楔住了。我試着玩弄strace,看到當啓動新的unoconv實例時,他們仍然連接並與soffice進程交談,只是在「壞」文檔進入後沒有其他事情發生。如果它很簡單以至於檢測到soffice不再與傳入的套接字交談,編寫看門狗將很容易。但顯然不是那麼簡單。任何想法如何判斷什麼時候南下?如何檢測並殺死一個楔入的soffice.bin進程?

回答

2

這裏是我的設置一個cron作業:

def monitor_unoconv 
    retval = false 
    target_dir = "/tmp/monitor_unoconv" 
    begin 
    Timeout::timeout(30) do 
     FileUtils.mkdir_p(target_dir) 
     FileUtils.cp(File.dirname(__FILE__) + "/../hello.odt", target_dir) 
     Dir.chdir target_dir do 
     retval = system("unoconv -f html hello.odt") 
     end 
    end 
    rescue => e 
    STDERR.puts "Caught error #{e.inspect}" 
    retval = false 
    end 
    if !retval 
    STDERR.puts "soffice process appears hung. Killing it" 
    STDERR.puts `killall soffice.bin` 
    sleep 5 
    STDERR.puts `killall -9 soffice.bin` 
    end 
end 

看起來工作正常。

0

問題可能與soffice多發線程, 所以解決伎倆可能是這樣的:

  1. 使用unoconv作爲一種服務。
  2. 創建一個init.d腳本並作爲守護進程啓動。
  3. 因此,unoconv作爲一項服務將不會運行單個並維護它,而不是unoconv調用soffice啓動。
  4. 開始創建過程文件,如下所示:

/bin/sh的

情況下, 「$ 1」

開始)

在/ usr/bin中/ unoconv --listener &

;;

停止)

killall soffice.bin

;;

重啓)

killall soffice.bin

睡眠1

的/ usr /斌/ unoconv --listener &

;;

esac