2010-12-13 190 views
1

我在Unix中使用SSH運行遠程計算機上的腳本時出現問題。該腳本意味着無限地運行,直到事件發生,在這種情況下,它將擺脫它的循環。不幸的是,在短暫的一段時間後,腳本停止運行。我相信這是與SSH相關的,因爲腳本運行時本地運行正常。在Unix中的遠程計算機上永久運行腳本

有沒有一種方法可以觸發我的遠程機器運行該腳本,就好像它正在本地運行一樣,以便我可以關閉SSH連接並且它仍然在運行?

調用位於遠程機器上的腳本,該腳本是這樣的:

#!/usr/bin/expect set add [lindex $argv 0] set add2 [lindex $argv 1] 
spawn ssh -l root2 ${add} /home/jason/localCopy/selfMonitor & 
expect *assword: send "BIGMASSIVESECRET\r" 
expect "]$ " 

在selfMonitor腳本包含的基本上是同時,將永遠運行,直到壞了真正的語句做的。

任何幫助表示讚賞,謝謝。

+0

停止使用expect,並且直接將密碼直接傳遞給ssh?或更好的,使用鍵。無論如何,這感覺更像是一個superuser.com/serverfault.com類型的問題。 – falstro 2010-12-13 18:23:43

回答

1

是的,你可以通過鍵入做到這一點使用screen

  • 登錄到遠程機器
  • 開始一個新的屏幕會話:screen
  • 然後運行腳本正常:./myscript
  • 然後,要分離:Ctrl-A, D

要reatt稍後,登錄到本機,然後運行screen -r以重新連接到正在運行的會話。

1

使用nohup可讓您的腳本忽略SIGHUP,該腳本在父shell退出時發送到後臺進程。

spawn ssh -l root2 ${add} nohup /home/jason/localCopy/selfMonitor & 

此外,ssh故意使腳本密碼輸入變得困難,並鼓勵您不要解決此問題。允許無密碼ssh訪問的正確方法是使用預授權密鑰。

  1. 在客戶端上運行ssh-keygen。您可以在所有提示處按Enter鍵以使用空白密碼。
  2. ~/.ssh/id_rsa.pub的內容添加到服務器上名爲authorized_keys的文件末尾:[email protected]:~/.ssh/authorized_keys

創建一個密鑰,然後將其添加到authorized_keys,允許客戶端連接到服務器而無需使用密碼,它可以讓您在不將密碼編碼成純文本腳本的情況下進行連接。

+0

我認爲這個答案是(+1)。一些評論,(1)我通常使用>&將所有輸出重定向到一個文件。如果你不這樣,那麼nohup將它寫入某個默認文件。如果你有兩個或多個以這種方式運行的進程,這會讓你感到困惑。 (2)我使用expect,一個tcl軟件包,當我不能使用預授權密鑰時,在ssh中輸入密碼。這很少見,但值得了解它的工作原理。 – 2011-03-08 17:50:35

0

使你的腳本運行下去,你需要做兩件事情

  1. 確保你不寫到終端。關閉它或重定向stdout和stderr,然後關閉stdin。如果你不這樣做,他們會保持SSH打開,並且/或者導致你的腳本在一個破損的管道上終止。
  2. 您需要在終端斷開連接時捕獲發送到您的進程的SIGHUP,並且通常會導致腳本終止。

這在不同的語言中有不同的表現,因此對於您選擇的語言,您需要查看它。在bash中,您使用exec >logfile 2>&1將stdout和stderr重定向到日誌文件,並使用trap "" HUP來忽略HUP信號。如果可以的話,還要啓動一個新的進程組,以將父pid重置爲init(正式使其成爲守護進程)。

如果您需要從腳本訪問終端輸出(無論出於何種原因無法重定向),我可以推薦屏幕。

0

另一種方法是將腳本妖魔化,以使其脫離與SSH相連的IO流並在啓動時啓動新會話。

這裏有一個不錯的HOWTO

如果你的腳本是用Perl或Python編寫的一些流行語言,你將能夠找到模塊來完成它。

相關問題