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. asp.net 前台绑定后台变量方法总结:<%= %> 和<%# %>的区别

    经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教.  一 ...

  2. JSONArray.toCollection 封装 bean 失败

    1. 问题描述: 通过http请求服务端, 返回的bean的集合的字符串形式, 其中bean中的Date类型的属性值,形式为Long类型的表示形式(1466083519000): String res ...

  3. PHP学习笔记:利用百度api实现手机归属地查询

    从来没有用过api,都不知道怎么获得api的数据,跟着demo,然后修改,终于实现了手机号码查询的功能,代码和说明很全,大家试试. <?php /** * Created by jianqing ...

  4. 如何使用mybatis《三》

    在前边阐述了单独使用mybatis的方法,在实际开发过程中mybatis经常和spring一起使用,即mybatis和spring进行集成,现在我们来看如何集成. mybatis和spring进行集成 ...

  5. 【基础】PHP变量及变量作用域

    新学PHP,比较有意思的语法,记录下. 1. 变量的作用域 作用域只分两个Global和Local,Global相对于整个.php文件来讲,Local是本地最小范围,是距离变量最近的范围,如:在函数中 ...

  6. JavaScript中instanceof运算符的用法以及和typeof的区别

    instanceof : 判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例:返回boolean类型栗子①: var aColors = ["red", "g ...

  7. access的逻辑类型

    Alter TABLE [表名] ADD [新增字段] BOOLEAN或者Alter TABLE [表名] ADD [新增字段] YESNO 或者Alter TABLE [表名] ADD [新增字段] ...

  8. vsphere vcenter server下安装ubuntu的vmwaretools

    0.参考文献 百度经验:这里面是以redhat桌面版为实例进行介绍的,我的环境是ubuntu-server,虽然不一样,也可以参考 http://jingyan.baidu.com/article/2 ...

  9. Android 之 Intent(意图)

    Intent是 Android中重要的桥梁之一,它分为显式意图和隐式意图.接下来分别针对这两种意图进行讲解. 显式意图:通过指定一组数据或动作,激活应用内部的 activity:(相比隐式意图,此做法 ...

  10. JAVA基础学习day14--集合一

    一.集合的出现 1.1.集合简述 面向对象语言对事物的体现都是以对象形式,为了方便对多个对象的操作,就对象对象进行存储,集合就是存仪储对象最常用的一种试 1.2.数组和集合都是容器 数组也存对象,存储 ...