falcon-agent模块代码里执行sys.CmdOutBytes命令导致的问题
背景介绍
公司在open-falcon项目的agent模块提供了一个方法,方法里的主要逻辑是通过内置的sys.CmdOutByte
s函数,调用linux的sh -c
命令。
http.HandleFunc("/run", func(w http.ResponseWriter, r *http.Request) {if r.ContentLength == 0 {http.Error(w, "body is blank", http.StatusBadRequest)return}bs, err := ioutil.ReadAll(r.Body)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}body := string(bs)log.Printf("...body..." + body)//调用linux的sh -c命令out, err := sys.CmdOutBytes("sh", "-c", body)if err != nil {w.Write([]byte("exec fail: " + err.Error()))return}w.Write(out)
})
参数经过外部传入后,在方法变成string类型(即body变量),交给sh -c
执行。
比如,传入的是echo '123'
,那么经过方法处理后变为sh -c "echo '123'"
;
传入的是一个/app/test/test.sh
文件,那么经过方法处理后变为sh -c "/app/test/test.sh"
。
问题场景
项目中某逻辑是agent接口,传入参数的是/app/open-falcon/plugin/filebeat/filebeat.sh
。
根据上述分析可知,经过方法处理后变为sh -c "/app/open-falcon/plugin/filebeat/filebeat.sh"
。
该sh文件里包含一段解压tar包的命令,如下
tar -zxf /app/open-falcon/plugin/filebeat/filebeat-7.11.1.tar.gz
正常来说,在执行后,在/app/open-falcon/plugin/filebeat
路径下,应该可以看到解压的目录。然而实际在执行后, 无法找到解压的tar目录。
问题分析
- 机器手动执行
通过xshell进入到该机器的/app/open-falcon/plugin/filebeat
路径,手动执行
sh -c "/app/open-falcon/plugin/filebeat/filebeat.sh"
脚本正常执行,且gz文件正常解压,说明脚本是没问题的。
为什么手动执行没问题呢?难道是通过agent接口执行时,会有环境变量的问题?
- source环境变量
在sh的前面加上
source /etc/profile
echo $(which tar)
通过打印,发现环境变量没问题。
难道是解压到其他目录了?
- find寻找文件
经过find / -name *filebeat*
寻找,发现在/app/open-falcon
里有通过sh脚本解压好的目录。
奇怪,为什么会在这个路径呢?而不是/app/open-falcon/plugin/filebeat
?
问题原因
因为在/app/open-falcon
路径才有open-falcon的二进制执行文件,所以agent接口调用sys.CmdOutBytes("sh", "-c", body)
时,其所在的路径为/app/open-falcon
。
而我们sh脚本里没有指定解压到哪个目录,所以最终解压的目录所在路径就为/app/open-falcon
问题解决
sh脚本改为
tar -zxf /app/open-falcon/plugin/filebeat/filebeat-7.11.1.tar.gz -C /app/open-falcon/plugin/filebeat
falcon-agent模块代码里执行sys.CmdOutBytes命令导致的问题相关推荐
- Java代码实现执行Linux服务器命令
通过jsch可以实现基于sftp协议的文件传输,使用的是ChannelSftp类,如果要在程序中实现启动服务器的一个脚本,执行某个系统命令的话,就需要用到另一个channel类了,就是ChannelE ...
- Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块...
一.前提介绍: 可以开辟作用域的只有类,函数,和模块 for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...
- python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
<简明Python教程>中第13章讲述"异常"时,有这样的一个实例, import sys try: s = raw_input('Enter something -- ...
- ES6 模块化的基本语法——默认导出 与 默认导入、按需导出 与 按需导入、直接导入并执行模块代码
ES6 模块化的基本语法 注意:每个模块中,只允许使用唯一的一次 export default,否则会报错! 按需导出 与 按需导入 注意:每个模块中,可以使用多次按需导出 直接导入并执行模块代码 有 ...
- Node.js ES6 模块化的基本语法-直接导入并执行模块代码
想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,可以直接导入并执行模块代码 m1.js // 当前文件模块为 m1.js for(let i = 0; i < 3; i++) { ...
- java执行sql列名无效_列名无效!java代码里的SQL语句!数据库里可以得到正确为什么放java里出错了?...
在数据库里执行下面的SQL语句可得到正确结果,放在java代码里错误了!Stringsql="SELECTtradeId,t.cardNo,tradeType,tradeAmount,tar ...
- python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...
原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...
- python 发红包import random用redenv_python 常用模块之random,os,sys 模块
python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...
- python一般的基础代码-Python:模块代码编写基础
1 创建模块:定义模块用文本编辑器,以py为后缀保存.文件命名需遵循python命名规则. 2 模块使用:import / from import:将整个模块对象赋值给一个变量名 from:将一个或者 ...
- 硬件开发——语音模块开发 (包含语音识别模块代码等资料包 )
一.语音模块以及硬件模块开发的行情 硬件模块的开发--常用:语音模块 语音模块STC11L08XE 比如 人脸识别打卡器--虹膜识别(购买方式) 语音识别(购买方式) 车牌识别(购买方式) 华为手机( ...
最新文章
- 《JAVA与模式》之装饰模式
- 数据表_事物码(Transaction Code)信息
- 关掉ajax 的异步,asp.net ajax 取消异步回送
- 程序员看过来:阿里毕玄提升代码能力的4段经历
- javaScript获取url中的参数
- bootstrap样式异常_处理异常功能样式
- 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
- LeetCode 2166. 设计位集(Bitset)
- 深入理解 Java 内存模型(一)——基础
- Winform GDI+ 绘图
- 导致页面顶部空白一行解决方法
- Mysql 如何做双机热备和负载均衡 (方法一)
- android计算器实现sin功能,简单实现Android计算器功能
- labview小波包分解
- 【MATLAB信号处理】信号波形的产生及系统时域分析
- FFT蝶形算法的verilog实现专题——从FFT算法的定义开始入手
- NeoKylin Linux Advanced Server release 6.0 安装及卸载达梦7入门操作
- 【DM642】ICELL Interface—Cells as Algorithm Containers
- maya模型展开UV
- 解决拉取远程分支后出现.xcodeproj Couldn't load project的问题
热门文章
- Win10怎么查找产品密钥? Win10产品密钥的3种查找方法
- Unmapped Spring configuration files found.
- ubuntu16.04 部署dzzoffice+onlyoffice 局域网实现word、excel文档协同编辑
- 用JAVA编程的数字时钟代码
- 张小平,海底捞,比特大陆
- 转换到coff期间_转换到 COFF 期间失败: 文件无效或损坏
- Arduino 操作BT008蓝牙串口模块
- wintel联盟即将崩盘,微软联合芯片企业开发ARM架构芯片
- 微信小程序文本溢出设置
- 电脑重装系统后谷歌浏览器连不上网的解决方案