我想使用 ssh 在多个远程主机上执行任意命令。这些命令大多是长时间运行的命令,用于监视服务器资源并将输出聚合到我的本地工作站(如tail -f
,mpstat
或tcpdump
/ tcpflow
withgrep
等)。
问题是我还没有找到一种方法来保持命令运行,同时可靠地终止所有主机的 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 ??
}
Run Code Online (Sandbox Code Playgroud)
看起来像gnu parallel的东西。尝试这样的事情:
function server_ssh() {
parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}
Run Code Online (Sandbox Code Playgroud)
--line-buffer
需要选项来允许将不同命令的输出混合在一起(默认情况下它将每个命令的输出分组在一起,因此必须等到每个命令完成显示)。
-u
也应该在这里工作。通常,它可能允许部分行混合在一起,但由于您使用的命令可能是基于行的,所以这种情况不应该发生。
编辑:--line-buffer
我的版本(20130922-1)正在进行 alpha 测试,我会选择-u
.
归档时间: |
|
查看次数: |
845 次 |
最近记录: |