我正在尝试tail
在多台远程机器上创建一个日志文件并将输出转发到我的本地工作站。我希望在按下Ctrl-时关闭连接C。
目前我有以下功能,几乎可以按预期工作。
function dogfight_tail() {
logfile=/var/log/server.log
pids=""
for box in 02 03; do
ssh server-$box tail -f $logfile | grep $1 &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
trap wait
}
Run Code Online (Sandbox Code Playgroud)
连接关闭,我从tail
. 但是,由于输出是成批出现的,因此存在某种缓冲。
这是有趣的部分……
我可以在执行以下操作时看到相同的缓冲行为,并将“测试”附加到/var/log/server.log
远程机器上的文件4-5 次……
ssh server-01 "tail -f /var/log/server.log | grep test"
Run Code Online (Sandbox Code Playgroud)
......并找到了两种禁用它的方法......
将 -t 标志添加到 ssh。
ssh -t server-01 "tail -f /var/log/server.log | grep test"
Run Code Online (Sandbox Code Playgroud)从远程命令中删除引号。
ssh server-01 tail -f /var/log/server.log | grep …
Run Code Online (Sandbox Code Playgroud)我想使用 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)