2013-05-17 82 views
0

我想知道服務器是否在運行,如果沒有,那麼我想啓動它。對於這種情況我寫了下面的bash腳本通過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 
" 

當我運行上面的程序,我收到以下錯誤

bash: -c: line 1: syntax error: unexpected end of file

可能有人請幫我在這方面

〜 Sunil

回答

2

你不能在bash中嵌套單引號。更改第二次出現:

'FNR == 1 {print $1}' 

要:

'\''FNR == 1 {print $1}'\'' 
+0

我已經修改了腳本的ssh -t機「CD /到/的/斌/路徑&&如果[-n $(須藤-u dev的PSü開發| grep的服務器名稱| awk的'FNR == 1 {print $ 1}')]然後echo'server_name正在使用 id $(sudo -u dev ps U dev | grep server_name | awk'\''FNR == 1 {print $ 1}'' 'else sudo -u dev sfservice server_name start fi「現在我得到錯誤test1.sh:第1行:意外的EOF,同時尋找匹配的''' test1.sh:第3行:語法錯誤:文件意外結束 –

+0

嘗試在第一個'$(sudo -u dev ps U盤| grep server_name | awk'FNR == 1 {pr int $ 1}')'。 – Paulpro

+0

即使現在我得到以下錯誤test1.sh:第1行:意外的EOF,同時尋找匹配的'「' test1.sh:第3行:語法錯誤:意外的文件結尾 –

1

你的報價被搞砸了。可能主要的問題是你把整個ssh腳本放在雙引號中。由於它包含在雙引號中,因此在將結果傳遞給遠程計算機之前,$(...)零件已在本地計算機上進行了評估,結果相當無關緊要。我將使用以下配方:

  1. 編寫應在遠程機器上執行的腳本。最好登錄到遠程機器並在那裏測試。

  2. 現在引號將整個腳本並更換通過'"'"'通過'\''或交替封閉'

  3. 在情況下,該命令包含應在本地機器上進行評估的變量,把'\'"在它前面和後"\''它。例如,如果在遠程機器上要執行的命令是

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

    $B本地機上進行評估,你

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

    3.1 注:這不是完全萬無一失–如果$B中的字符串包含',將會失敗。如果您無法保證$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 
' 
1

有幾件事情可以做,以提高指揮和簡化報價:

  1. 沒有必要使用sudo看到運行的其他用戶進程運行ps
  2. 使用-q選項可抑制grep的輸出,並只需檢查退出狀態 以查看是否找到匹配項。
  3. 使用帶有echo的雙引號允許svc_id參數展開。
  4. 圍繞整個命令在ssh的參數中使用單引號。
  5. 據推測,/to/the/bin/pathsfservice住在哪裏?您可能只需指定運行該命令的完整路徑,而不是更改工作目錄。

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 
'