写了个小程序,批量ssh远端服务器操作,并且将结果保存到本地.
现在使用的方法:
使用exec.Command 执行命令,获取cmd.Stdout ,并且结果outf.WriteString到文件.
如果场景变成是grep 一个比较大的日志,有比较大的标准输出,这个时候是全部都读取到内存再一次性写到文件中么? 是否有办法可以进行优化?谢谢.
写了个小程序,批量ssh远端服务器操作,并且将结果保存到本地.
现在使用的方法:
使用exec.Command 执行命令,获取cmd.Stdout ,并且结果outf.WriteString到文件.
如果场景变成是grep 一个比较大的日志,有比较大的标准输出,这个时候是全部都读取到内存再一次性写到文件中么? 是否有办法可以进行优化?谢谢.
解决此类问题最好在远端做事情,尽可能的让远端直接处理输入,将处理过且精简了的输出通过 ssh 传回来。
在远端,为了尽量不在内存中载入全部文件,也应该尽量使用管道的方式逐行处理,或者直接打开文件句柄进行操作。
如果不方便在远端装可执行代码,可以考虑每次在先将处理程序通过 ssh 传过去。
P.S. 如果仅仅是想做类似 grep 这种逐行处理的操作,那么直接读 stdout 也未尝不可,立即读立即处理,这样并不会造成太多的内存消耗。
此外,exec.Command 不知道内部实现如何,很可能会一次读取所有内容到内存。一个稳妥的做法是使用 os.StartProcess 来执行 ssh,它的最后一个参数可以用来重定向命令的 stdout,详见文档。
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答897 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.1k 阅读
多谢huan du 和felix ,使用os/exec就可以处理所有的内容了.
Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and stdout, connect I/O with pipes, and do other adjustments.