2016-02-29 56 views
4

如果某些应用程序在某些远程计算机上运行,​​我正在尝试“ping”。ssh + ksh + grep + wc

要做到这一点我有服务器和应用程序文件,如:

server1:application1 
server2:application1 
server3:application2 
Etc. 

我希望获得的这个名字是在服务器上运行的应用程序数量。

连接并检查我需要一个SSH连接。

我的脚本是bash和是这样的:

Ping_Applications() {  
    SetParam 
    cat $APPFILE | while read next 
    do 
    server=`echo $next | cut -d : -f1` 
    app=`echo $next | awk -F":" '{print $2}'` 

    commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'" 
    eval COMA=\$\($commando\) 
    echo $commando 

    if [ $COMA != 0 ] 
    then 
     echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m"; 
    else 
     echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m"; 
    fi 
    done; 
} 

我的问题是,当我送

ssh $server 'ps -fea | grep $app | grep -v grep | wc -l' 

这将返回的数量,但是当通过使用脚本发送,我没有回答,因为(我认为)管道打开一个新的外壳。

我不知道如何解决这个问题。

有什么想法?

感谢

路易斯

+0

欢迎使用stackoverflow。在突出显示的代码/数据/错误信息中,使用编辑框左上角的“{}”工具来保持正确的格式。祝你好运! – shellter

+0

是不是有一个原因,你不是直接运行命令,而是将它放入字符串'eval'?此外,不相关,但你可以尝试使用'pgrep'而不是'ps'和2'grep' –

回答

2

这是Bash FAQ 50

你想把命令在阵列中,而不是使用eval调用它:

commando=(/bin/ssh $server '/bin/ps -fea | /bin/grep "'"$app"'" | /bin/grep -v grep | /bin/wc -l') 
COMA=$("${commando[@]}") 

commando是一个数组有3个元素,所以最后一个元素可以作为一个单词传递给远程服务器。注意周围$app

而且细心的报价,因为$ COMA将是一个数,使用数字比较:if [ $COMA -ne 0 ]

0

您可能要分开/斌/ ssh命令及其参数。也把 “突击队” 在双引号:

相反的:

commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'" 
eval COMA=\$\($commando\) 

试试这个:

commando="/bin/ps -fea | /bin/grep $app ..." 
/bin/ssh $server "$commando" 

bash的变量被双引号中扩展,而不是在单引号。

0

感谢您的帮助

我混埃里克雷诺夫和格伦·杰克曼的答案和解决方案ES这样的:

Ping_Applications() {  
SetParam 
cat $APPFILE | while read next 
do 
server=`echo $next | cut -d : -f1` 
app=`echo $next | awk -F":" '{print $2}'` 

commando=(/bin/ssh $server '/bin/pgrep -f "'"$app"'" | /bin/wc -l') 
COMA=$("${commando[@]}") 

if [ $COMA -gt 0 ] 
then 
    echo -e "$TIME : Application $app of on server $server is \E[32m[ RUNNING ]\E[0m"; 
else 
    echo -e "$TIME : Application $app of on server $server is \E[31m[ NOT RUNNING ]\E[0m"; 
fi 
done; 

}

现在我有一个不同的问题:

此解决方案的工作原理,但只适用于第一个输入,然后脚本停止。

我的$ APPFILE中有大约10个不同的应用程序,但只有第一个被执行。

问候。

Luis