2014-04-30 33 views
0

即時通訊工作在分佈式系統和我的程序是完整的,我已經測試過,它運行良好,超過10臺機器,但每次我想測試程序我必須: - 將文件複製爲每臺機器 - SSH到每臺機器並輸入「Java的罐子文件」Bash腳本部署和運行jar文件

爲了避免不好受過程中我做了這個

for i in {1..11} 
do 
    if [ $i -ne 6 ]; 
    then 
     sshpass -p "qwerty" scp myJar.jar [email protected]$i.XXXX.XX.XX:someFolder; 
     sshpass -p "qwerty" ssh [email protected]$i.XXXX.XX.XX "java -jar someFolder/myJar.jar &" & 
    fi 
done 

,由於某種原因它不工作像它應該, scp命令按照它應該執行,但另一個不執行。

該程序應該產生一個內部有2個日誌的文件夾,如果我手動執行它,所以我想不是權限問題,但不是與腳本。 如果我運行頂層,我可以看到每個機器上運行的java進程。

BTW:那些2 &是那麼它的腳本犯規在命令行運行的每個罐子

+0

IP和'「java'之間沒有空格嗎? – choroba

+0

複製粘貼錯誤,現在修復 – Miksel

回答

0

我建議使用SSH密鑰,而不是表達的密碼(這被記錄下來,是可見的其他用戶,而不是之後卡住在腳本中提及它的存在)。 github ssh key generation docs對此很不錯(添加,附加到服務器的〜/ .ssh/authorized_keys文件)。

一旦生成客戶端上的一個鍵,並添加其PUBKEY到服務器,你應該能夠運行:

for i in {1..11} 
do 
    if [ $i -ne 6 ] # skip server six 
    then 
     cat myJar.jar |ssh [email protected]$i.XXXX.XX.XX \ 
      "cd someFolder; cat > myJar.jar; java -jar myJar.jar" & 
    fi 
done 

注意符號存在,它是報價外(這樣它運行在你的客戶端上,而不是你的服務器上)。您不能將SSH會話發送到後臺,因爲父會被終止。

予,以減少連接的數目口角成一行此(第一cat命令轉儲文件到標準輸出,而第二cat命令的標準輸入(myJar.jar的內容)寫入到目標位置)。我不確定是否可以直接將它直接輸入到java(cat myJar.jar |ssh [email protected] "cd someFolder; java -jar -"),所以我只剩下它。

我假設你不必從someFolder的父項運行.jar。實際上在目標目錄中似乎更簡單。如果目標目錄不存在,請在cd命令之前添加mkdir -p someFolder;。如果目錄已經存在,-p將確保沒有任何反應。如果您必須從父項運行它,請刪除cd命令並將「myJar.jar」替換爲「someFolder/myJar.jar」

+0

謝謝你的一些小的修改它的工作 – Miksel