runc kill

// kill sends the specified signal (default: SIGTERM) to the container's init process

1、runc/kill.go

Action: func(context *cli.Context) error

首先和大多数命令类似,调用container, err := getContainer(context)获取容器实例。之后再调用sigstr := context.Args().Get(1)和signal, err := parseSignal(sigstr)获取信号,最后调用container.Signal(signal)将信号传递给容器的init process。

2、runc/libcontainer/container_linux.go

func (c *linuxContainer) Signal(s os.Signal) error

这个函数很简单,直接调用c.initProcess.signal(s)

3、runc/libcontainer/process_linux.go

func (p *initProcess) signal(sig os.Signal)

这个函数也很简单,直接调用syscall.Kill(p.pid(), s)即可

runc delete

// delete any resources held by one container or more containers often used with detached containers

1、runc/delete.go

Action: func(context *cli.Context) error

首先调用factory, err := factory.Args().Present()获取工厂实例,因为runc delete后面可以添加多个容器id,因此我们需要遍历参数,对每个容器进行操作。对于每个容器,我们先调用container, err := factory.Load(id)获取容器实例。当err不为nil且err为libcontainer.Error的时候,说明这是一个启动过程中abort的容器,它的容器目录依旧存在,但是因为没有state.json文件,所以我们并不能看到它。这时,我们只需要将它的容器目录删除即可。若为正常的容器,那么我们先调用s, err := container.Status获取容器的状态,接着根据状态的不同,分别进行操作:

(1)、若s为libcontainer.Stopped时,调用destroy(container)即可

(2)、若s为libcontainer.Created时,则调用killContainer(container)

(3)、若为其他情况,当force被置位时,则调用killContainer(container),否则报错

2、runc/delete.go

func killContainer(container libcontainer.Container) error

首先调用container.Signal(syscall.SIGKILL)给容器的init进程发送KILL信号,接着再进入一个for循环,不断调用container.Signal(syscall.Signal(0)),测试容器是否还活着,当确认容器已经stop的时候, 调用destroy(container)。注:一般用给一个进程发送signal 0,来检测进程是否存在

3、runc/utils_linux.go

func destory(container libcontainer.Container)

这个函数很简单,直接调用container.Destory()

4、runc/libcontainer/container_linux.go

该函数先调用c.m.Lock()上个锁,接着调用return c.state.destroy()

5、runc/libcontainer/state_linux.go

如果c.config.Namespaces.Contains(configs.NEWPID)为false的话,则调用killCgroupProcesses(c.cgroupManager)。接着调用c.cgroupManager.Destroy()摧毁容器的cgroup。接着设置c.initProcess = nil, 然后调用runPoststopHooks(c),最后设置c.state为&stoppedState{c: c}

runc kill 和 delete流程分析的更多相关文章

  1. runc start container流程分析

    1.runc/start.go Action: func(context *cli.Context) error 该函数首先调用container, err := getContainer(conte ...

  2. hadoop运行流程分析源代码级

    前言: 最近一直在分析hadoop的运行流程,我们查阅了大量的资料,虽然从感性上对这个流程有了一个认识但是我总是感觉对mapreduce的运行还是没有一个全面的认识,所以决定从源代码级别对mapred ...

  3. Android 4.4KitKat AudioRecord 流程分析

    Android是架构分为三层: 底层      Linux Kernel 中间层  主要由C++实现 (Android 60%源码都是C++实现) 应用层  主要由JAVA开发的应用程序 应用程序执行 ...

  4. SQL Server中CURD语句的锁流程分析

    我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...

  5. 第2章 rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是本文的姊妹篇: 1.rsync(一):基本命令和用法 2.rsync(二):ino ...

  6. Android系统分析之运营商显示流程分析之运营商信息的读取流程二

    运营商显示流程分析之运营商信息的读取流程 一. SIM卡运营商信息的读取 从前面的 运营商信息的获取和赋值 可以知道SIM卡运营商的赋值最终是在 SIMRecords 中完成的, 而SIM卡信息的相关 ...

  7. Cocos2dx开发之运行与渲染流程分析

    学习Cocos2dx,我们都知道程序是由 AppDelegate 的方法 applicationDidFinishLaunching 开始,在其中做些必要的初始化,并创建运行第一个 CCScene 即 ...

  8. rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...

  9. Android之 MTP框架和流程分析

    概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介            对Mtp协议进行简单的介绍.第2部分 MTP框架            介绍 ...

随机推荐

  1. csharp: Socket

    https://github.com/joeandaverde/socket.io-csharp-client http://websocket4net.codeplex.com/ http://ww ...

  2. FL2440驱动添加(3)LCD驱动添加学习笔记

    FL2440 LCD内置控制器,320*240 TFT型LCD. 自我理解总结的两种添加驱动模式: 非platform方式添加驱动: 加载驱动: 1,硬件初始化,申请内存,并作地址映射 2,分配设备号 ...

  3. 如何使用mybatis《一》

    mybatis作为ORM轻量级框架一出现就吸引了无数人的眼球,比hibernate要简单且入门较容易,下面开始我的第一个mybatis程序. 一.下载mybatis的包 我们知道任何一个框架都会有其包 ...

  4. oop典型应用:实体类

    1.什么是实体类 简单地说就是描述一个业务实体的“类”,业务实体直观一点理解就是整个就是整个软件系统业务所涉及的对象. eg:MySchool系统中的班级,学生,年级等都是业务实体,“雷电”游戏中的飞 ...

  5. mysql 数据类型,字符集

    数据类型 1,数值类型2,字符串类型3,日期和时间4,ENUM和SET5,几何数据类型   数据类型选项 unsigned   无负值 zerofill        数值显示有影响,会前置0来填充不 ...

  6. XPM转换与查看工具

    X PixMap (XPM)是一种基于ASCII编码的图像格式,在X Window系统中的应用十分广泛.她最初由位于法国Sophia Antipolis的Bull研究中心的Daniel Dardail ...

  7. css权重是什么

    css权重是什么? 概述 css Specificity中文一般译为css优先级.css权重.相比"权重","优先级"更好理解,mozilla官方中文文档就翻译 ...

  8. 关于在EXCEL中输入01-01-01被转换为2001/1/1怎么解决

    当向EXCEL写入类似'01-01-01'或'01-01'这样的数据时,打开EXCEL时会发现数据变成了2001/1/1和1月1日. 这是由于EXCEL自动转换功能,我们得要在输入前多加一个’号. 而 ...

  9. oracle10g 统计信息查看、收集

      1. 统计信息查看 1.1 单个表的全局统计信息.统计效果查看 2. 统计信息分析(收集) 2.1 分析工具选择 2.2 分析前做index重建 2.3 分析某数据表,可以在PL/SQL的comm ...

  10. HTML中图片热区的使用

    在HTML中有一个具有把图片划分成多个作用区域,并链接到不同网页的标记,那就是 <area>地图作用区域标记. <area>标记主要用于图像地图,通过该标记可以在图像地图中设定 ...