2014-07-24 48 views
0

我正在編寫一個簡單的函數來測試Cassandra是否在本地機器上運行(通過捕獲service cassandra status的輸出。問題是此命令總是退出,返回狀態爲3,返回狀態很差。我已經成功地在前面調用了service cassandra stop到這個命令,甚至嘗試在一個循環中運行status來查看是否存在一些競爭條件(它似乎可靠地在狀態3下很長時間失敗)。但是,通過shell運行service cassandra status。任何想法是什麼問題可以是,甚至只是如何調試這個如何從命令行調試scala的sys.process命令失敗時使用錯誤的退出代碼(3)?

private def isCassandraStopped(): Boolean = { 
    val s = Seq("sudo", "sh", "-c", "service cassandra status").!! 
    val r = " * Cassandra is not running" == s 
    if (!r) logger.info(s"Cassandra is not stopped: #$s#") 
    r 
    } 

這是之前執行上述方法成功行:

Seq("sudo", "sh", "-c", "service cassandra stop").! 
+0

你可以發佈init.d腳本嗎?是手工製作還是附帶一個包裝在你的系統上?此外,還可以從shell中運行:'service cassandra status> /tmp/my.log'和'echo $?',然後查看是否有任何輸出進入屏幕,什麼是退出狀態。 –

+0

文件中有很多內容,但據我所知,我們沒有從標準cassandra包中更改任何內容。我運行'echo $?',它看起來像cassandra沒有運行時通常返回狀態3,所以我可以檢查返回狀態代碼,不做任何字符串比較。 – jonderry

回答

1

如果您正在讀取帶有!!的輸出過程,那麼默認情況下會有任何非零退出狀態引發異常,如docs中所述。您可以嘗試解決該問題並讀取輸出,並按照here所述的方式獲取進程退出狀態。

默認情況下,退出狀態3應該表示程序未運行,如描述的here。但是,這可能不會被您的初始化腳本所尊重。所以最好的辦法是閱讀腳本,並確保它在這種情況下返回退出代碼3。

那麼你的選擇是:

  • 只讀如果它是可靠的
  • ,請檢查您運行腳本是如何實現的,並自己複製進程狀態檢查邏輯退出碼 - 通常它會檢查pid文件存在,該pid進程正在運行(checkpid)。
  • 如其他SO QA中所述讀取輸出和退出狀態
  • 讀取所有行,但不會引發異常,請使用lines_!Process("your command here").lines_!。在這種情況下,您不會有退出狀態。

通常退出狀態在正確編寫的shell腳本中比輸出解析更可靠。

相關問題