0

我想知道服务器是否正在运行,如果没有,那么我想启动它。对于这种情况,我编写了以下 bash 脚本

ssh -t machine "cd /to/the/bin/path 
  && if [ -n $(sudo -u dev ps U dev | grep server_name | awk 'FNR == 1 {print $1}') ] 
     then 
          echo 'podsvr is running with 
             id $(sudo -u dev ps U dev | grep POD | awk 'FNR == 1 {print $1}')' 
     else 
          sudo -u dev sfservice server_name start 
     fi
"

当我运行上述程序时,出现以下错误

bash:-c:第 1 行:语法错误:文件意外结束

有人可以在这方面帮助我吗

~苏尼尔

4

3 回答 3

2

您不能在 bash 中嵌套这样的单引号。更改第二次出现:

 'FNR == 1 {print $1}'

至:

'\''FNR == 1 {print $1}'\''
于 2013-05-17T05:45:02.793 回答
1

你的引用搞砸了。可能主要问题是您将整个 ssh 脚本放在双引号中。由于它包含在双引号中,因此$(...)在将结果传递给远程机器之前,这些部件已经在本地机器上进行了评估,结果相当荒谬。我会使用以下食谱:

  1. 编写应该在远程机器上执行的脚本。最好登录到远程机器并在那里进行测试。

  2. 现在将整个脚本用引号括起来,用.''\'''"'"'

  3. 如果命令包含应在本地计算机上评估的变量,请将其放在'\'"它的前面和"\''后面。例如,如果要在远程机器上执行的命令是

    foo "$A" "$B" 'some string' bar
    

    $B应该在本地机器上进行评估,你会得到

    'foo "$A" '\'"$B"\'' '\''some string'\'' bar'
    

    3.1注意:这不是完全万无一失的——如果$B包含的字符串会失败'。在不能保证没有'inside 的情况下,为了安全起见$B,可以先执行QQ=\'\\\'\' ; ProtectedB=${B//\'/$QQ},然后在上面的命令中使用'\'"$ProtectedB"\'',而不是。'\'"$B"\''

  4. 使用结果作为 ssh 的参数。

我假设以下工作(但我不能在这里测试)。

ssh -t machine '
    cd /to/the/bin/path
    && if [ -n "$(sudo -u dev ps U dev | grep server_name | awk '\''FNR == 1 {print $1}'\'')" ]
       then
           echo "podsvr is running with id $(sudo -u dev ps U dev | grep POD | awk '\''FNR == 1 {print $1}'\'')"
       else
           sudo -u dev sfservice server_name start
       fi
'
于 2013-05-17T12:28:55.383 回答
1

您可以做一些事情来改进命令并简化引用:

  1. 无需运行psusingsudo即可查看以其他用户身份运行的进程。
  2. 使用该-q选项来抑制 的输出grep,并简单地检查退出状态以查看是否找到匹配项。
  3. 使用双引号 withecho以允许svc_id参数扩展。
  4. 在整个命令中使用单引号作为 的参数ssh
  5. 想必,/to/the/bin/path是哪里sfservice住的?您可能只需指定运行命令的完整路径,而不是更改工作目录。

ssh -t machine 'if ps U dev -o command | grep -q -m1 server_name; then
                  svc_pid=$( ps U dev -o pid,command | grep -m1 POD | cut -d" " -f 1 )
                  echo "podsvr is running with id $svc_pid"
                else 
                  sudo -u dev /to/the/bin/path/sfservice server_name start 
                fi
'
于 2013-05-17T12:42:01.230 回答