背景介绍

公司在open-falcon项目的agent模块提供了一个方法,方法里的主要逻辑是通过内置的sys.CmdOutBytes函数,调用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命令导致的问题相关推荐

  1. Java代码实现执行Linux服务器命令

    通过jsch可以实现基于sftp协议的文件传输,使用的是ChannelSftp类,如果要在程序中实现启动服务器的一个脚本,执行某个系统命令的话,就需要用到另一个channel类了,就是ChannelE ...

  2. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块...

    一.前提介绍: 可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...

  3. python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案

    <简明Python教程>中第13章讲述"异常"时,有这样的一个实例, import sys try: s = raw_input('Enter something -- ...

  4. ES6 模块化的基本语法——默认导出 与 默认导入、按需导出 与 按需导入、直接导入并执行模块代码

    ES6 模块化的基本语法 注意:每个模块中,只允许使用唯一的一次 export default,否则会报错! 按需导出 与 按需导入 注意:每个模块中,可以使用多次按需导出 直接导入并执行模块代码 有 ...

  5. Node.js ES6 模块化的基本语法-直接导入并执行模块代码

    想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,可以直接导入并执行模块代码 m1.js // 当前文件模块为 m1.js for(let i = 0; i < 3; i++) { ...

  6. java执行sql列名无效_列名无效!java代码里的SQL语句!数据库里可以得到正确为什么放java里出错了?...

    在数据库里执行下面的SQL语句可得到正确结果,放在java代码里错误了!Stringsql="SELECTtradeId,t.cardNo,tradeType,tradeAmount,tar ...

  7. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...

    原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...

  8. python 发红包import random用redenv_python 常用模块之random,os,sys 模块

    python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...

  9. python一般的基础代码-Python:模块代码编写基础

    1 创建模块:定义模块用文本编辑器,以py为后缀保存.文件命名需遵循python命名规则. 2 模块使用:import / from import:将整个模块对象赋值给一个变量名 from:将一个或者 ...

  10. 硬件开发——语音模块开发 (包含语音识别模块代码等资料包 )

    一.语音模块以及硬件模块开发的行情 硬件模块的开发--常用:语音模块 语音模块STC11L08XE 比如 人脸识别打卡器--虹膜识别(购买方式) 语音识别(购买方式) 车牌识别(购买方式) 华为手机( ...

最新文章

  1. 《JAVA与模式》之装饰模式
  2. 数据表_事物码(Transaction Code)信息
  3. 关掉ajax 的异步,asp.net ajax 取消异步回送
  4. 程序员看过来:阿里毕玄提升代码能力的4段经历
  5. javaScript获取url中的参数
  6. bootstrap样式异常_处理异常功能样式
  7. 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
  8. LeetCode 2166. 设计位集(Bitset)
  9. 深入理解 Java 内存模型(一)——基础
  10. Winform GDI+ 绘图
  11. 导致页面顶部空白一行解决方法
  12. Mysql 如何做双机热备和负载均衡 (方法一)
  13. android计算器实现sin功能,简单实现Android计算器功能
  14. labview小波包分解
  15. 【MATLAB信号处理】信号波形的产生及系统时域分析
  16. FFT蝶形算法的verilog实现专题——从FFT算法的定义开始入手
  17. NeoKylin Linux Advanced Server release 6.0 安装及卸载达梦7入门操作
  18. 【DM642】ICELL Interface—Cells as Algorithm Containers
  19. maya模型展开UV
  20. 解决拉取远程分支后出现.xcodeproj Couldn't load project的问题

热门文章

  1. Win10怎么查找产品密钥? Win10产品密钥的3种查找方法
  2. Unmapped Spring configuration files found.
  3. ubuntu16.04 部署dzzoffice+onlyoffice 局域网实现word、excel文档协同编辑
  4. 用JAVA编程的数字时钟代码
  5. 张小平,海底捞,比特大陆
  6. 转换到coff期间_转换到 COFF 期间失败: 文件无效或损坏
  7. Arduino 操作BT008蓝牙串口模块
  8. wintel联盟即将崩盘,微软联合芯片企业开发ARM架构芯片
  9. 微信小程序文本溢出设置
  10. 电脑重装系统后谷歌浏览器连不上网的解决方案