我想使用 ssh 在多個遠端主機上執行任意命令。這些命令大多是長時間運行的命令,用於監視伺服器資源並將輸出聚合到我的本機工作站(例如tail -f
、mpstat
或tcpdump
/tcpflow
等grep
)。
問題是我還沒有找到一種方法來保持命令運行,同時稍後可靠地終止所有主機的 SSH 連線和遠端命令。
我嘗試了許多ssh
標誌變體,等待、貓、讀取、陷阱等...要么兩者都立即被終止,本地終端被卡住,要么遠端命令在 ssh 連接被終止後繼續在遠端主機上運行。
這就是我現在所擁有的。
function server_ssh() {
pids=""
for box in 01 02 03; do
ssh -t -t -f server$box "$1" &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
# wait, cat, read ??
}
答案1
看起來像是一些東西gnu並行。試試這樣的事情:
function server_ssh() {
parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}
--line-buffer
需要選項來允許將不同命令的輸出混合在一起(預設情況下它將每個命令的輸出分組在一起,因此必須等到每個命令完成顯示)。
-u
也應該在這裡工作。通常,它可能允許部分行混合在一起,但由於您使用的命令可能是基於行的,所以這種情況不應該發生。
編輯:--line-buffer
我的版本(20130922-1)正在進行 alpha 測試,我會選擇-u
.