在bash腳本中,我通過ssh在遠程機器上執行命令。如果用戶按Ctrl + C打破腳本,它只會停止腳本 - 甚至不是ssh客戶端。此外,即使我殺死SSH客戶端的遠程命令仍在運行...如何讓ssh在中斷ssh本身時終止遠程進程?
如何使bash殺死本地ssh客戶端和Crtl + c上的遠程命令調用?
一個簡單的腳本:當你按下Ctrl + C
#/bin/bash
ssh -n -x [email protected] 'mysqldump db' -r file.sql
在bash腳本中,我通過ssh在遠程機器上執行命令。如果用戶按Ctrl + C打破腳本,它只會停止腳本 - 甚至不是ssh客戶端。此外,即使我殺死SSH客戶端的遠程命令仍在運行...如何讓ssh在中斷ssh本身時終止遠程進程?
如何使bash殺死本地ssh客戶端和Crtl + c上的遠程命令調用?
一個簡單的腳本:當你按下Ctrl + C
#/bin/bash
ssh -n -x [email protected] 'mysqldump db' -r file.sql
我 - 最終發現這樣一個解決方案:
#/bin/bash
ssh -t -x [email protected] 'mysqldump db' -r file.sql
所以 - 我用的不是 '-n' '-t'。 刪除'-n'或使用不同於root的用戶不會有幫助。
trap "some_command" SIGINT
將執行some_command
本地。 help trap
會告訴你其他的選擇。
關於ssh
問題,我對ssh知之甚少。也許你可以撥打ssh -n -x [email protected] 'killall mysqldump'
而不是some_command
殺死遠程命令?
你知道你傳遞給ssh的選項嗎?我猜不是。 -n選項重定向來自/ dev/null的輸入,因此您在遠程主機上運行的進程可能沒有看到來自Ctrl-C的SIGINT。
現在,讓我們來談談的想法是多麼的糟糕允許遠程root登錄:
這是一個非常,非常糟糕的主意。看看HOWTO: set up ssh keys瞭解如何通過ssh安全地管理遠程進程的執行。如果您需要遠程運行某些特權,您可能需要一個解決方案,該解決方案包含一個帶有嵌入式命令的ssh公鑰和一個以sudo作爲根目錄運行的腳本。
當你的ssh會話結束時,你的shell會得到一個SIGHUP。 (掛斷信號)。您需要確保它將它發送到從其開始的所有進程。對於bash,請嘗試shopt -s huponexit; your_command
。這可能不起作用,因爲手冊頁說huponexit只適用於交互式shell。
我記得遇到這個問題時,用戶在我的羣集上運行作業,以及他們是否必須使用nohup(以獲得您想要的相反行爲),但在bash手冊頁中找不到任何內容子進程默認是否忽略SIGHUP。希望huponexit能夠做到這一點。 (你可以把這個shopt放在你的.bashrc裏,而不是在命令行上,我想)。
你的ssh -t
應該可以工作,因爲當連接關閉時,從終端讀取會得到EOF或錯誤,這使大多數程序退出。
我需要-t -t(兩次)才能使其工作。 – gravitation 2013-08-14 00:29:06