当前位置: 首页 > news >正文

宜昌 公司 网站建设/2021年重大新闻事件

宜昌 公司 网站建设,2021年重大新闻事件,seo策划方案,河北省中级经济师考试目录 1.1 踩坑案例1.2 填坑解法1.3 坑位分析1.4 坑后扩展1.4.1 扩展知识1.4.1 技术关键字1.5 填坑总结1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行: a. 多线程的网络通信包处理 和控制Master节点交互有固定Listen端口b. 定期作业任务…

目录

  • 1.1 踩坑案例
  • 1.2 填坑解法
  • 1.3 坑位分析
  • 1.4 坑后扩展
    • 1.4.1 扩展知识
    • 1.4.1 技术关键字
  • 1.5 填坑总结

1.1 踩坑案例

踩坑的程序是个常驻的Agent类管理进程, 包括但不限于如下类型的任务在执行:

  • a. 多线程的网络通信包处理
    • 和控制Master节点交互
    • 有固定Listen端口
  • b. 定期作业任务, 通过subprocess.Pipe执行shell命令
  • c. etc

发现坑的过程很有意思:

  • a.重启Agent发现Port被占用了
    • => 立刻想到可能进程没被杀死, 是不是停止脚本出问题
      • => 排除发现不是, Agent进程确实死亡了
      • => 通过 netstat -tanop|grep port_number 发现端口确实有人占用
    • => 调试环境, 直接杀掉占用进程了之, 错失首次发现问题的机会
  • b.问题在一段时间后重现, 重启后Port还是被占用
    • 定位问题出现在一个叫做xxxxxx.sh的脚本, 该脚本占用了Agent使用的端口
      • => 奇了怪了, 一个xxx.sh脚本使用这个奇葩Port干啥(大于60000的Port, 有兴趣的砖友可以想下为什么Agent默认使用6W+的端口)
      • => review该脚本并没有进行端口监听的代码
  • 一拍脑袋, c.进程共享了父进程资源
    • => 溯源该脚本,发现确实是Agent启动的任务中的脚本之一
    • => 问题基本定位, 该脚本属于Agent调用的脚本
    • => 该Agent继承了Agent原来的资源FD, 也就是这个port
    • => 虽然该脚本由于超时被动触发了terminate机制, 但terminate并没有干掉这个子进程
    • => 该脚本进程的父进程(ppid) 被重置为了1
  • d.问题出在脚本进程超时kill逻辑

1.2 填坑解法

通过代码review, 找到shell具体执行的库代码如下:

self._subpro = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,preexec_fn=_signal_handle
)
# 重点是shell=True !

把上述代码改为:

self._subpro = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,stderr=subprocess.PIPE, preexec_fn=_signal_handle
)
# 重点是去掉了shell=True

1.3 坑位分析

Agent会在一个新创建的threading线程中执行这段代码, 如果线程执行时间超时(xx seconds), 会调用 self._subpro.terminate()终止该脚本.

表面正常:

  • 启用新线程执行该脚本
  • 如果出现问题,执行超时防止hang住其他任务执行调用terminate杀死进程

深层问题:

  • Python 2.7.x中subprocess.Pipe 如果shell=True, 会默认把相关的pid设置为shell(sh/bash/etc)本身(执行命令的shell父进程), 并非执行cmd任务的那个进程
  • 子进程由于会复制父进程的opened FD表, 导致即使被杀死, 依然保留了拥有这个Listened Port FD

这样虽然杀死了shell进程(未必死亡, 可能进入defunct状态), 但实际的执行进程确活着. 于是1.1中的坑就被结实的踩上了.

1.4 坑后扩展

1.4.1 扩展知识

本节扩展知识包括二个部分:

  • Linux系统中, 子进程一般会继承父进程的哪些信息
  • Agent这种常驻进程选择>60000端口的意义

扩展知识留到下篇末尾讲述, 感兴趣的可以自行搜索

1.4.1 技术关键字

  • Linux系统进程
  • Linux随机端口选择
  • 程序多线程执行
  • Shell执行

1.5 填坑总结

  1. 子进程会继承父进程的资源信息
  2. 如果只kill某进程的父进程, 集成了父进程资源的子进程会继续占用父进程的资源不释放, 包括但不限于

    • listened port
    • opened fd
    • etc
  3. Python Popen使用上, shell的bool状态决定了进程kill的逻辑, 需要根据场景选择使用方式

建议大家也看一下这篇文章的姊妹篇, 此篇是子孙进程无法 kill/杀死的终极解法 [Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)] (https://www.cnblogs.com/mythmgn/p/10945941.html)

转载于:https://www.cnblogs.com/mythmgn/p/10945865.html

http://www.lbrq.cn/news/1403659.html

相关文章:

  • 湖南平台网站建设公司/营销推广案例
  • 东莞市人民政府/淘宝优化关键词的步骤
  • 网站后台权限管理/微信推广软件哪个好
  • 网站主机查询/seo专业培训机构
  • 广元商城网站开发/百度问答下载安装
  • 石狮网站建设联系电话/自己如何制作网页
  • 校园网站设计的毕业论文/购买友情链接
  • 国外做装饰画的网站/百度搜索名字排名优化
  • 漫画网站开发/黑帽seo优化推广
  • 爬闪数媒 网站建设/哪里搜索引擎优化好
  • 网站首页的动态效果图怎么做/网站seo报告
  • 长宁区网站建设网页制/网站建设与管理主要学什么
  • 泛微e8做网站门户/小学四年级摘抄新闻
  • 网站字体特效/seo关键词推广怎么做
  • 网站建设优化是什么鬼/关键词权重如何打造
  • 涞水县住房和城乡建设局网站/郴州网站推广
  • 网站付费推广/网站快速优化排名app
  • 上海建站市场/百度推广上班怎么样
  • 做网站做百度竞价赚钱/网络推广公司联系方式
  • 想要给网站加视频怎么做/seo实战培训机构
  • php网站开发技术是什么/长沙网站设计
  • 苏州网站建设科技/中国目前最好的搜索引擎
  • 青岛模板网站建设价格/抖音关键词排名查询工具
  • 南宁seo推广外包/百度竞价优化
  • 阜阳市住房和城乡建设局网站/百度的网页地址
  • 架子鼓谱那个网站做的好/it培训机构出来能找到工作吗
  • 长沙网站seo/电商培训
  • 网站怎么建设的/百度拍照搜索
  • 网站制作售后/江门百度seo公司
  • 盘锦做网站建设的/如何做好宣传推广
  • [Git] 如何拉取 GitHub 仓库的特定子目录
  • Vue 2 项目中快速集成 Jest 单元测试(超详细教程)
  • 源代码安装部署lamp
  • 深度学习——R-CNN及其变体
  • 静配中心配药智能化:基于高并发架构的Go语言实现
  • 【SpringBoot】Swagger 接口工具