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. linux下安装或升级GCC4.8,以支持C++11标准

    C++11标准在2011年8月份获得一致通过,这是自1998年后C++语言第一次大修订,对C++语言进行了改进和扩充.随后各编译器厂商都各自实现或部分实现了C++中的特性. 如需查看各编译器对C++1 ...

  2. YEdit

    YEdit YEdit is a YAML editor for Eclipse. See the wiki for more details Installation Use the Eclipse ...

  3. MyEclipse8.6安装SVN 教程 与遇到的问题

    按网上的多种方式都不好用     最后这种好用 了! 写此文做记录. MyEclipse版本:8.6 SVN版本:1.6.9 MyEclipse版本要对应SVN版本.否则会出错. 教程: 1.下载最新 ...

  4. ValueStack值栈和ActionContext

    Struts2在OGNL之上提供的最大附加特性就是支持值栈(ValueStack),在OGNL上下文中只能有一个根对象,Struts2的值栈则允许存在许多虚拟对象. 一:值栈(ValueStack) ...

  5. pygame for python3.3

    pygame的更新慢的令人发指,我最初使用的python是3.4版本的,无何奈何pygame不支持3.4,甚至官网只有3.2版本的.我于是将各种版本试了一遍,出现各种问题,同时我比较钟爱3.x版本,最 ...

  6. .NET Core 和 ASP.NET 5 RC1 发布

    昨天微软发布了 .NET Core 和 ASP.NET 5 候选版本,支持 Windows,Linux 和 OS X 平台,版本 License 为 "Go Live",,也就是说 ...

  7. couchbase单向同步

    我们知道,couchbase默认情况下就是N主的HA模式,bucket同时存储在多个节点中.如下所示: 但事实上,有些时候我们希望某些节点只能读,不能写以避免各种副作用以及分布式系统下出于管理和安全性 ...

  8. Swift 学习笔记第一天-变量常量,及数据类型

    1.定义变量 用关键字 var 比如 var i=2 2.定义常量用let 如let c=3 可见Swift 定义时不用指定类型.由编译器推断 如果想指定类型 var i:Int32=2 练习 let ...

  9. C#源码500份

    C Sharp  短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...

  10. AT NEW F、AT END OF F注意事项

    1.F只能是内表的第一个字段 2.AT NEW F.AT END OF F使用F之后内表内容会变为* 解决出现*的办法: FIELD-SYMBOLS:<ITAB> LIKE  ITAB L ...