2009-10-27 34 views
20

我目前正在嘗試ssh進入遠程計算機並運行一個腳本,然後讓腳本運行。以下是我的腳本。但是,當它運行時,腳本在機器上成功運行,但ssh會話掛起。有什麼問題?如何使用ssh在後臺運行命令並分離會話

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

回答

24

在某些情況下,您想要在遠程機器/服務器上執行/啓動某些腳本(它將自動終止)並斷開與服務器的連接。

例如:在其執行

  1. 當箱中運行的腳本需要一個模型,並將其複製到遠程服務器
  2. 與模型運行仿真創建一個腳本,並將其推送到服務器
  3. 在服務器上啓動腳本並斷開連接
  4. 因此啓動的腳本的責任是在服務器中運行仿真,一旦完成(需要幾天的時間才能完成)將結果複製回客戶端。

我會用下面的命令:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven,你可以將一個腳本所有這些命令,把它推到遠程服務器,如下啓動它:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

希望這個作品;-)

編輯: 您還可以使用 SSH用戶@主機「卵石ñ-S SESSIONNAME -d -m 「/路徑/到/可執行文件」」

它創建了一個分離屏幕會話並在其中

+0

如果您正在運行的命令需要從文件輸入(例如大數據庫導入,例如mysql cayblood 2012-10-17 21:02:34

4

它可能是標準輸入流。試試ssh -n ...ssh -f ...

+0

尼斯,謝謝。' ssh -f「user @ host DISPLAY = myhost:0.0 qtcreator&」' – kyb 2018-01-31 18:08:22

21

您對使用screen這個有什麼看法?你可以通過ssh運行screen來啓動命令(concat.sh),然後你可以返回到屏幕會話,如果你想監視它(可以很方便,取決於concat的作用)。

更具體地講,試試這個:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

你應該發現,提示符會立即返回,並concat.sh在遠程機器上運行。我將解釋一些選項:

  • ssh -t使TTY。屏幕需要這個。
  • screen -dm使其以「分離」模式啓動。這就像你的目的的「背景」。
  • -S測試爲您的屏幕會話提供了一個名稱。這是可選的,但建議。

現在,一旦你這樣做,你可以去到遠程計算機並運行此:

screen -r testing 

這將附上你包含你的程序的屏幕會話。從那裏你可以控制它,殺死它,查看它的輸出,等等。按Ctrl-A,然後d會將您從屏幕會話中分離出來。 screen -ls將列出所有正在運行的會話。

+0

你介意明確告訴我該怎麼做? – 2009-10-27 01:14:37

+2

@John Zwinck,這對你來說確實有用嗎?下面的命令d oes不適合我:ssh -t HOST「screen -dm -S sleep sleep 10」。它只是說「連接到HOST關閉」,當我登錄到服務器時,沒有分離的屏幕。 – richardkmiller 2012-01-08 01:11:06

+4

@richardkmiller:剛纔我試了一下,我得到了同樣的(壞)結果。我將'-t'選項改爲ssh替換爲'-f',以便它背景命令(並且不分配TTY),然後運行。我懷疑是因爲我寫了這個答案,所以在介入2年以上的Linux中發生了一些變化......嘗試'ssh -f HOST「screen -dm -S sleep sleep 10」',現在你可能會發現它可行。 – 2012-01-12 04:09:56

0

對我來說,運行目標命令,只有這個工作:

screen -dmS name sh my-script.sh 

這當然取決於屏幕,如果你想要標準輸入或標準輸出,可以稍後添加。當my-script.sh結束時,屏幕將自行終止。

0

下面是一個更普遍的決定,需要一些努力去發現,它確實爲我工作:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

它發出的命令$ theStuff列表的選項卡中任何$ theTabNumber屏幕會話$的screenSessionName代表「user」在「服務器」上初始創建。

請注意尾隨空格後 -X東西\」 發送到克服一個‘東西’選項的干擾。在接下來的行中的空白和$ theStuff被‘確認’追加(^ M)按鍵,不要錯過他們!

的‘這是一個測試’消息在初始終端呼應,和$ theStuff命令所提到的屏幕/選項卡里面確實執行。