首页 > 其他分享 >腾讯云镜YunJing——Agent定时任务脚本分析

腾讯云镜YunJing——Agent定时任务脚本分析

时间:2023-04-13 10:32:32浏览次数:28  
标签:云镜 Agent YunJing sh usr agent local 内存

缘起

如果你有台腾讯云主机,会发现默认有个叫 YunJing 的进程。 image.png 把它kill掉后,发现一段时间又出现了

image.png

image.png 这是为什么捏? 5637557320fbfb3292307735f0b8acd53a791241.png@112w_112h.png

分析定时任务配置文件

通过crontab定时任务目录, 会发现有个叫yunjing的配置文件。

*/30 * * * * root /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1
@reboot root sleep 30 && /usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1
*/5 * * * * root /usr/local/qcloud/YunJing/clearRules.sh > /dev/null 2>&1

简单分析下: 1.第一行是说,每30分钟运行一次YDCrontab.sh脚本,丢掉输出的结果。 2.第二行是说,在重启后,延迟30秒会运行一次 YDCrontab.sh 脚本。 3.第三行是说,每5分钟执行一次 clearRules.sh脚本。

分析定时任务脚本

来看下YDCrontab.sh这个脚本文件 cat /usr/local/qcloud/YunJing/YDCrontab.sh

#! /bin/sh

umask 0022
unset IFS
unset OFS
unset LD_PRELOAD
unset LD_LIBRARY_PATH
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

if [ -w '/usr' ]; then
    myPath="/usr/local/qcloud/YunJing/YDLive"
else
    myPath="/var/lib/qcloud/YunJing/YDLive"
fi
agent_name="$myPath/YDLive"

check_user()
{
    if [ "root" != "`whoami`" ]; then
        echo "Only root can execute this script"
        exit 2
    fi    
}

check_alive()
{
    status=`ps ax | grep "$agent_name" | grep -v "grep" |wc -l`

    if [ $status -ne 0 ]; then
        # process exist
        echo "YunJing agent already exist"
        exit 1
    fi        
}

### Main Begin ###

check_user
check_alive
cd $(dirname $0)
export GODEBUG=madvdontneed=1,netdns=go
nohup $agent_name >/dev/null 2>&1 &

ret=$?
if [ $ret -eq 0 ]
then
    echo "YunJing agent run succ"
else
    echo "YunJing agent run failed, errcode: $ret"
fi
exit $ret

### Main End ###
  1. 第3行是 指定在建立文件时预设的权限掩码, 022 表示默认创建新文件权限为755 也就是 rxwr-xr-x(所有者全部权限,属组读写,其它人读写)
  2. 第4-7行呢是取消设置相应环境变量。将环境设置为默认状态。 a. IFS 内部字段分隔符,用于指定 bash 应如何解释命令或数据中的空格。 b. OFS 代表输出字段分隔符,用于确定写入文件时用于分隔单词的字符。 c. LD_PRELOAD 超脱于动态链接库的搜索路径先后顺序之外,它可以指定在程序运行前优先加载的动态链接库。 d. LD_LIBRARY_PATH用于指定查找共享库(动态链接库)时除了默认路径(./lib和./usr/lib)之外的其他路径。
  3. 第10-14行,检查当前执行脚本的用户是否是 root, 不是就给予提示并以状态2退出, 2表示用法不当(Incorrect Usage),shell内建命令使用错误。
  4. 第25-35行,检查 YDLive agent 进程个数,如果不等于(-ne)0, 则认为是程序存在。打印信息并退出,1表示通用错误。
  5. 第40行,将工作目录更改为与脚本相同的目录。
  6. 第41行,更新GODEBUG环境变量。 a.netdns 默认情况下,使用纯粹的 Go 解析器,因为阻塞的 DNS 请求仅消耗一个 goroutine ,而阻塞的 C 调用消耗操作系统线程。(这个效率比cgo效率高啊!) b. 设置 madvdontneed=1 将会在Linux上当内存返回内核时使用 MADV_DONTNEED 代替 MADV_FREE
  7. 第42行,若前面的检测成功,那么把YDLive以后台模式运行。
  8. 第44-50行,检查是否成功启动,启动失败会打印错误码

Go内存释放策略

Go 使用 madvise 系统调用来释放物理内存给操作系统,该方法主要有两种归还类型可选: MADV_DONTNEED:立即归还物理内存给操作系统,如果下次访问到该范围的内存,则会触发 page fault 异常,需要重新分配物理页,使用该类型可以减少程序的RSS占用。 MADV_FREE告诉操作系统这块内存已经不需要使用了,可以回收了,如果内存紧张,操作系统就会将其回收。这实际是一个lazily的释放过程。如果再次访问这块内存的时候,操作系统还没有将其回收,是不会触发 page fault 的。使用该类型,可能程序的RSS不会减少。

总结

通过这次分析学习,了解到了使用定时任务保持进程活跃的方法和Go内存的回收策略,真是太好啦。 c8e919a83f19aa615d0a24cb1e752a449561.gif


参考: 孙兴芳 [Golang环境变量之GODEBUG] (https://www.jianshu.com/p/94a9c41d503d) (https://www.jianshu.com/p/94a9c41d503d) can [go中的物理内存释放](https://mcll.top/2020/04/13/go%E4%B8%AD%E7%9A%84%E5%86%85%E5%AD%98%E9%87%8A%E6%94%BE/)

标签:云镜,Agent,YunJing,sh,usr,agent,local,内存
From: https://blog.51cto.com/spaceack/6183947

相关文章

  • CentOS 本地镜像源替换为阿里云镜像源
     本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/294简介CentOS,是基于RedHatLinux提供的可自由使用源代码的企业级Linux发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。下载地址: https://mirrors.aliyun.......
  • 哪吒探针 - Windows 和Linux端agent安装(详细注意版)
    一、Windows端agent安装配置环境准备环境:Windows服务器软件:哪吒探针点击下载、nssm点击下载(探针agent和nssm都要下载准备好)设置环境变量下载软件后,解压到任意位置,然后按win+R打开运行窗口,输入sysdm.cpl打开系统属性–>高级–>环境变量–>系统变量–>Path在最后把......
  • 敏捷开发 CICD 阿里云效 加 阿里云镜像仓库篇(一)
    一、前言之前这2篇都是利用Jenkins+Docker+Gitee去目标服务器构建镜像然后去发布业务系统。https://www.cnblogs.com/mangoubiubiu/p/17134059.htmlhttps://www.cnblogs.com/mangoubiubiu/p/17125069.html二、利用阿里云效+阿里云镜像仓库一键发布服务(包括中间件的初始化......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • ambari-agent in not running
    ERROR2023-04-0609:24:25,787Controller.py:453-Controllerthreadfailedwithexception:Traceback(mostrecentcalllast): File"/usr/lib/python2.6/site-packages/ambari_agent/Controller.py",line438,inrun   self.actionQueue=ActionQueue(......
  • CentOS7安装zabbix-agent
    一:系统要求1.centos72.zabbix服务器端5.0版本 二:安转和配置zabbix1.安装zabbix存储库#rpm-Uvhhttps://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm#yumcleanall2.安装zabbix代理#yuminstallzabbix-agent3.启动zabb......
  • wgcloud监控agent批量版本升级脚本
    [root@masterserver]#catallupdate_agent.shusername="root"passwd="Oet01279"port="22"timeout=5cmd="cd/home/wgcloud/agent-linux-amd64-v3.4.4&&wget--no-check-certificatehttp://192.168.0.13:9090/wgcloud/resource......
  • jenkins添加agent打包
    背景公司有很多项目,经常使用jenkins并行构建代码,但是因为都是同一台jenkins上构建,并行任务多了就影响效率,一个工程用时15分钟,如果两个同时构建可能每个人都得25分钟才能完成,于是我就想添加一台agent来分担压力,以下是具体操作步骤。1、准备一台linux主机准备一台linux主机,安装git......
  • Magento 1.9.X 系列教程
    Magento安装下载教学:Magento教程1:免费购物车系统,轻松建立Magento第一步!Magento教程2:Magento社群版安装教学!Magento教程3:如何在Magento社群版(CommunityEdition)安装范例资料?Magento工作流程:Magento教程4:主机环境准备Magento教程5:系统安装与备份Magento教程6:商店设定与参数......
  • magento 获取产品的属性值
    magento采用强大的EAV设计方法,我们可以很方便的给商品添加任意数量的属性,那如何在前台获取这些属性值呢? magento同样提供了很方便的方式来读取它。使用$_product->getAttributeName()或者$_product['AttributeName']就可以获得指定名字属性的值,以颜色属性color为例,可以这样写 ......