2015-10-13 73 views
2

我有一個簡單的bash腳本,假設它監視mysql是否啓動或關閉。如果發生故障,我想也停止運行HAProxy。下面是我簡單的bash腳本:Linux bash腳本代理怪異

#!/bin/bash 

nc -z 127.0.0.1 3306 
rt_val=$? 
msg=$(sudo service haproxy stop); 
if [ $rt_val != 0 ]; then 
    eval $msg 
    exit 3 
else 
    exit 0 
fi 

MySQL運行或不運行部分工作正常。這是停止HAProxy部分,似乎有問題。發生什麼事是當mysql停止時HAProxy停止。但是,當我啓動MySQL和HAProxy時,即使MySQL啓動並運行,腳本似乎仍會停止HAProxy。

回答

7

在您的腳本中,您無條件地執行sudo service haproxy stop並使用命令替換將輸出存儲在$msg中。

您可以將命令存儲在變量中,但這被認爲是非常糟糕的做法(請參閱Bash FAQ 050)。相反,嘗試分配命令的功能,後來調用它(function關鍵字,這是Bash特有的兩種可選的,離開它的便攜性):

#!/bin/bash 

function stopcmd() { sudo service haproxy stop ; } # semicolon needed if on single line 

nc -z 127.0.0.1 3306 
rt_val=$? 

if [ $rt_val != 0 ]; then 
    stopcmd 
    exit 3 
else 
    exit 0 
fi 

此外,無論是功能還是測試([ ... ])在這種簡單的情況下真的很有必要。您的腳本可寫爲:

#!/bin/bash 

if nc -z 127.0.0.1 3306 
then 
    exit 0 
else 
    sudo service haproxy stop 
    exit 3 
fi 
+0

推薦在字符串中存儲命令不是一個好主意。函數或數組** **更好,更強大。有關此問題的更多詳細信息,請參見[Bash FAQ 050](http://mywiki.wooledge.org/BashFAQ/050)。 (它適用於這種簡單的情況,但對於更復雜的情況失敗,所以最好總是避免它。) –

+0

@EtanReisner:當然可以。我會盡力改正。 –

+0

謝謝邁克爾。使用該功能的作品。第二件代碼實際上沒有。 –