ssh + ksh + grep + wc

4

我想要“ping”一些远程机器上的应用程序是否正在运行。

为此,我有一个包含服务器和应用程序的文件,例如:

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'

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

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

有什么想法吗?

谢谢

Luis


欢迎来到 StackOverflow。使用位于编辑框左上角的 {} 工具来保持正确的格式,包括代码、数据和错误信息等。祝你好运! - shellter
你为什么不直接运行命令,而是将其放在字符串中进行“eval”?此外,虽然与此无关,但你可以尝试使用pgrep而不是ps和2个grep - Eric Renouf
3个回答

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

你可能想要将/bin/ssh命令和其参数分开。并在“commando”两侧加上双引号:

而不是:

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

感谢您的帮助

我结合了Eric Renouf和Glenn Jackman的答案,得出了以下解决方案:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接