首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ssh + ksh + grep + wc

ssh + ksh + grep + wc
EN

Stack Overflow用户
提问于 2016-02-29 14:57:30
回答 3查看 206关注 0票数 4

如果某些应用程序在某些远程机器上运行,我将尝试"ping“。

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

代码语言:javascript
复制
server1:application1
server2:application1
server3:application2
Etc.

我希望获得在服务器中运行的具有此名称的应用程序的数量。

要连接和检查,我需要一个ssh连接。

我的脚本是bash,如下所示:

代码语言:javascript
复制
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;  
}

我的问题是当我

代码语言:javascript
复制
ssh $server 'ps -fea | grep $app | grep -v grep | wc -l'

这将返回数字,但是当使用脚本发送时,我没有回答,因为(我认为)管道打开了一个新的shell。

我不知道怎么解决这个问题。

有什么想法吗?

谢谢

路易斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-29 15:42:11

我是Bash FAQ 50

您希望将命令放在数组中,而不是使用eval来调用它:

代码语言:javascript
复制
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 ]

票数 2
EN

Stack Overflow用户

发布于 2016-02-29 16:11:57

您可能需要分隔/bin/ssh命令及其参数。也把“突击队”放在双引号上:

而不是:

代码语言:javascript
复制
commando="/bin/ssh $server '/bin/ps -fea | /bin/grep $app | /bin/grep -v grep | /bin/wc -l'"
eval COMA=\$\($commando\)

试试这个:

代码语言:javascript
复制
commando="/bin/ps -fea | /bin/grep $app ..."
/bin/ssh $server "$commando"

Bash变量是在双引号中展开的,而不是在单引号中展开的。

票数 0
EN

Stack Overflow用户

发布于 2016-03-01 21:17:11

谢谢你的帮忙

我混合了Eric Renouf和Glenn Jackman的答案,解决方案如下:

代码语言:javascript
复制
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个不同的应用程序,但只有第一个应用程序被执行。

致以问候。

路易斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35702696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档