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实现ssh自动登陆

如何在shell脚本中使用逻辑或&和

如何让shell访问正在运行的docker容器

什么是posix shell

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

shell编程实战之网站文件及数据库文件的备份

shell脚本命令示例

如何在shell脚本中为用户分配密码

nmcli的网络配置

详解shell实现ssh自动登陆

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



打赏

取消

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

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

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

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

评论

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