shell实现网络client方法


本文摘自PHP中文网,作者PHP中文网,侵删。

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

先上代码:

1

2

3

4

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方法的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

网络组实现的步骤详解

总结shell中的特殊字符

linux终端执行shell脚本时提示权限不足

实例分享shell字符截取命令之cut命令

通过几个案例掌握shell编程条件分支结构

如何从shell脚本创建二进制文件

linux中bash是什么意思?

centos7系统网络不通

如何在shell脚本中传递命令行参数

一文读懂shell编程三剑客之一的sed命令

更多相关阅读请进入《shell》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...