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. PhpWind 8.7中禁止后台管理员随意修改会员用户名功能

    有人反映PHPWind 8.7中后台可以直接修改用户名的功能太过随意,干脆禁掉. OK,研究一下他的代码,admin/usermange.php  tempalate/admin/usermange. ...

  2. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  3. javascript 之拼接html字符串

    // var one = {"id":1, "leasetime":2, "ney":0,"myhuifangshi": ...

  4. jdk1.8 J.U.C之FutureTask实现机制分析

    我画了一张关于FutureTask的类图,主要包括FutureTask的几个重要的函数和字段,还有它和父类的关系. 根据上面图我们可以清晰的看出FutureTask的继承关系.FutureTask继承 ...

  5. vmware mysql报kernel: EXT4-fs (dm-0): Unaligned AIO/DIO on inode 1055943 by mysqld; performance will be poor

    kernel: EXT4-fs (dm-0): Unaligned AIO/DIO on inode 1055943 by mysqld; performance will be poor

  6. 如何解决div层被flash遮盖的问题

    页面构建中的Flash层会遮挡Div的问题,一般通过设置wmode="transparent" 或wmode="window"就可以解决.不过对于Flash视频 ...

  7. jQuery $.extend()用法总结

    Query开发插件的两个方法 1.jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法. 2.jQuery.fn.extend(object);给jQuery对象添加 ...

  8. REUSE_ALV_GRID_DISPLAY显示ALV,设置可编辑时,与内表数据同步问题

    使用function module: REUSE_ALV_GRID_DISPLAY显示ALV,并设置alv某些列可编辑,可是编辑后发现对应的内表数据并没有随之改变.记得需要设置一个参数的值,怎么想也记 ...

  9. 响应式SharePoint模版页

    一张好的皮肤显然的会给你的项目加分不少.特别是大部分的项目,UI甚至可以决定成败. SharePoint在这方面一直都做得不好,曾经我有好多项目都是坐在美工旁边来一起修改样式.痛苦的经历. 不久以前, ...

  10. centos如何安装软件

    背景 之前用的linux操作系统移植都是ubuntu,没有用过redhat版本的linux,最近开始想学习redhan版本的linux,就从centos开始.在安装完centos以后,第一个碰到的问题 ...