首页 > 运维 > linux运维 > 正文

shell实现网络client方法

PHP中文网
发布: 2017-06-20 11:58:16
原创
1845 人浏览过

需要把线上的access日志发送到另一个程序接收
开始想着用python实现,虽然python也有实现类似tail -F的方式,但太麻烦,而且效率也有折扣
偶然发现了shell可以实现网络client,并且只用几行代码就可以实现

先上代码:

trap "exec 8<&-;exec 8>&-" 0
file='/data/nginx/llogs/access.log'
exec 8<>/dev/tcp/10.3.0.200/9001
tail -F "$file" | grep --line-buffered "sid">&8
登录后复制

超级简单,实际处理的逻辑的代码就2行以下是代码说明:
第一行主要是捕获程序退出状态,退出后关闭连接
第二行定义日志文件
第三行建立网络连接,linux有个特殊的文件/dev/(udp|tcp)/ip/port
把这个文件绑定到一个文件描述符上即可建立对应的网络连接,文件描述符大于3即可
第四行发送数据到这个建立好的通道中
因为grep会有缓冲区,默认等缓冲区满了后才会输出数据,因此必须加上--line-buffered参数,使用行缓冲
不然server端收到的数据会有断行。

这种agent超级简单功能性能也不错但有个弊端
agent和server建立通道后,若server挂了,那么agent通道断开就也挂了,程序就会退出(tcp client有这个问题,upd没有)
或是网络不好也可能导致agent退出(我这次没有这个问题都是光纤互联网络)
所以需要有对应的监控程序检测agent,异常时自动重启,或者如果网络质量不错的话考虑使用udp

以上是shell实现网络client方法的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!