【问题标题】:ssh + ksh + grep + wcssh + ksh + grep + wc
【发布时间】:2016-06-12 16:15:57
【问题描述】:

如果某些应用程序正在某些远程计算机上运行,​​我正在尝试“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'

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

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

有什么想法吗?

谢谢

路易斯

【问题讨论】:

  • 欢迎来到stackoverflow。在突出显示的代码/数据/错误消息上使用编辑框左上角的{} 工具以保持正确的格式。祝你好运!
  • 您是否有理由不直接运行该命令,而不是将其放入eval 的字符串中?此外,不相关,但您可以尝试使用 pgrep 而不是 ps 和 2 greps

标签: bash ssh scripting


【解决方案1】:

这是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 ]

【讨论】:

    【解决方案2】:

    您可能希望将 /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 变量在双引号中展开,但不是在单引号中。

    【讨论】:

      【解决方案3】:

      感谢您的帮助

      我混合了 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 个不同的应用程序,但只有第一个被执行。

      问候。

      路易斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-30
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        相关资源
        最近更新 更多