2014-12-02 24 views
2

在一個非常簡化的情況下該怎麼做,我有一個腳本,看起來像這樣:擊:當標準輸出不存在

ssh localhost "test.sh foo" 

的:

mv test _test 
sleep 10 
echo $1 
mv _test test 

,如果我執行它只要腳本正在運行,測試文件的名稱中就會有一個下劃線,當腳本完成時,它會發回foo。即使您通過按ctrl+c來終止ssh命令,或者如果您失去了服務器的連接,但它不會(該文件不會重命名回「test」),該腳本仍應繼續運行。所以,我試過如下:

nohup ssh localhost "test.sh foo" 

,這讓SSH免疫ctrl+c但到服務器斷線連接還是引起了麻煩。經過一些調試後,事實證明,如果腳本中沒有ECHO,腳本實際上會達到最終結果。當你考慮它的時候,這是有道理的 - 當連接斷開時,沒有更多stdout(ssh套接字)可以回顯,所以它會自動失敗。

我當然可以,呼應一個文件,然後得到的文件,但我寧願更聰明的東西,沿着test tty && echo $1(但tty調用像這樣總是返回false)線。任何建議,非常感謝。

+0

我嘗試不同的東西,比如:' ssh -t localhost「測試。我甚至把所有環境變量和'/ dev'目錄的內容打印出來,然後把所有的環境變量和/ dev目錄的內容打印出來到一個文件,只是爲了查看腳本是否能夠以某種方式識別連接丟失......我能想到的唯一兩個想法是ping回主機或將輸出保存到文件中,但我確信有更多微妙的解決方案... – Ulrik 2014-12-03 21:59:07

+0

'>/dev/null 2>&1'是你的朋友 – 2014-12-03 23:46:15

+0

是的,但我需要從腳本接收輸出,除非我失去了與服務器的連接 - 在任何一種情況下,腳本都必須結束 – Ulrik 2014-12-04 01:32:02

回答

1

以下命令你想要做什麼:

ssh -t [email protected] 'nohup ~/test.sh foo > nohup.out 2>&1 & p1=$!; tail -f ~/nohup.out & wait $p1' 

... test.sh位於用戶主目錄

說明:

1.)「ssh -t user @ host」...非常清楚...啓動遠程會話
2.)「nohup〜/ test.sh foo> nohup.out 2> & 1」...啓動在後臺使用nohup的test.sh腳本
3.)「p1 = $ !;」 ...將前一個命令的子pid存儲在p1
中4.)「tail -f〜/ nohup.out &」...在後臺運行tail nohup.out以查看test.sh的輸出
5。 )「wait $ p1」...等待進程test.sh(pid存儲在p1中)完成

即使用ctrl + c中斷它,上述命令仍然有效。

+0

Wel l,這將腳本的輸出存儲在一個文件中,等待它終止,然後顯示該輸出。但是,當你失去與服務器的連接時,寫入'stdout'的任何內容都會失敗並中斷腳本 - echo,cat,tail,你可以命名它。嘗試執行ifconfig eth0 down正在運行,你會知道我在說什麼(使用'ctrl + c'更容易) – Ulrik 2014-12-04 01:44:35

+1

尾部失敗,但文件被移回測試。並且使用「-t」選項,您可以使用「test tty && echo $ 1」tty測試。 – st0ne 2014-12-04 07:28:23

1

可以使用...

ssh -t localhost "test.sh foo" 

...強制tty分配

+0

您的建議非常有意義,就像'nohup'一樣,但不幸的是,它不起作用 - 'ctrl + c'終止執行遠程腳本和連接丟失仍然會導致迴應失敗... – Ulrik 2014-12-03 21:52:46

0

由於st0ne建議,tail失敗,但不會導致腳本終止,而不是catecho。因此,沒有必要對nohup,重定向stdout到一個臨時文件等只是簡單明瞭:

mv test _test 
sleep 10 
echo $1 | tail 
mv _test test 

,並執行它:

ssh localhost "test.sh foo" 
相關問題