2015-10-13 80 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

谢谢迈克尔。使用该功能的作品。第二件代码实际上没有。 –