在那篇《 使用独立PID namespace防止误杀进程》中的最后,我碰到了一个难题,那就是父PID namespace中的进程无法使用进入子PID namespace中通过echo $$ >$pidfile写入的pid值,进程发信号时,目标pid是和自己处于同样的PID namespace的。当时我的方法是使用ps+grep的方式去寻找,然而如果遇到多个同名进程的时候,这一招也将碰壁。那么有没有别的办法呢?在我这,这类问题是我最想碰到的啦,哈哈。
        还记得进入子PID namespace的bash后,ps -e为何还是父进程的结果吗?因为mount proc的原因,因为在mount的时候,procfs就初始化了一个mount调用者的PID namespace,进入子PID namespace后,只要你不重新mount proc,那么/proc下挂载的还是原来的。proc下面有一个self目录,表示当前的进程,记住,self内部的status文件中获取到的值,使用的都是这个procfs被挂载时的PID namespace,也就是父PID namespace!于是办法就是:

echo $(cat /proc/self/status|awk -F ' ' '/PPid/{print $2}') >$pidfile

为何是PPid呢?因为Pid不是脚本的pid,而是cat程序的,由于cat是脚本调用的,自然取它的父进程pid就可以了,执行了上述的指令后,在mount新的procfs就好了。以下是一个测试脚本,在新的PID namespace中执行:

#!/bin/bash
echo $$
# 卸掉新的procfs,暴露出老的procfs
umount /proc
cat /proc/self/status|awk -F ' ' '/PPid/{print $2}'
# 重新挂载新的procfs
mount -t proc proc /proc
cat /proc/self/status|awk -F ' ' '/PPid/{print $2}'

其它的namespace
除了PID namespace,Linux中还有很多namespace,我比较关心的就是网络这一块,幸运的是,为了支持虚拟化以及隔离,Linux实现了netns,很简单,在调用clone的时候,加上CLONE_NEWNET这个flag就可以了,一个独立的netns,网卡,路由,iptables规则等都是隔离的,一块物理网卡只能属于一个namespace,使用下面的命令可以将一块网卡放到一个子namespace中:

ip link set dev ethX netns $子namespace在父namespace中的pid

这样做的一个典型应用就是管理接口,带外管理口可以放在一个独立的netns中,实现与其它业务网卡的完全隔离。

子PID namespace中获取父namespace中pid的方法的更多相关文章

  1. javascript 获取父页面中元素对象方法

    父页面中: <input type="hidden" id="areaID" value="test1"> <iframe ...

  2. Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法

    在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素  1. 格式:window ...

  3. js获取iframe中的元素以及在iframe中获取父级的元素(包括iframe中不存在name和id的情况)

      第一种情况:iframe中不存在name和id的方法:(通过contentWindow获取) var iframe = document.getElementsByTagName('iframe' ...

  4. linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...

  5. Oracle中获取执行计划的几种方法分析

    以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下     1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...

  6. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  7. vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法

    Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...

  8. Active Directory中获取域管理员权限的攻击方法

    Active Directory中获取域管理员权限的攻击方法         译:by  backlion 0x00 前言 攻击者可以通过多种方式在Active Directory中获得域管理员权限, ...

  9. (转)Shell中获取字符串长度的七种方法

    Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...

随机推荐

  1. Webservice中使用Session、Application

    原文:Webservice中使用Session.Application 在Asp.Net 2.0里,已经能够在WebMethod里使用 Session . Application 这种服务器变量了.一 ...

  2. 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别

    原文:日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别 {0:yyyy-MM-dd HH:mm:ss.fff}:使用24小 ...

  3. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

  4. monkey源码分析之事件注入方法变化

    在上一篇文章<Monkey源码分析之事件注入>中,我们看到了monkey在注入事件的时候用到了<Monkey源码分析番外篇之Android注入事件的三种方法比较>中的第一种方法 ...

  5. curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in

    当系统开启safe_mode和 open_basedir,在程序中使用以下语句 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 并且遇到301,302状态 ...

  6. 2.2 LINQ中使用from子句指定数据源

    数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象. 可以将IEnumerable<T>简单 ...

  7. Spring IOC之容器概述

    1.SpringIOC容器和beans介绍 IOC的依赖注入是这样的,对象定义他们的依赖也就是他们需要在一起起作用的对象是通过构造器参数以及工厂方法的参数或者是当他们被构建或者是从工厂中返回时设置在对 ...

  8. 使用Visual Studio 2010 - 初学者系列 - 学习者系列文章

    本文介绍Visual Studio 2010的基本使用. 1.  欢迎界面 2.  进入界面 3.选择菜单中的项目 4.选择项目路径,还有空白解决方案 5.选择 新建解决方案文件夹 6.选择新建项目 ...

  9. Sql Server中如何快速修正SQL 语句错误

    本文将和大家讨论一些关于找SQL 错误的问题. 现在的系统基本都是需要用到数据库的,既然用到数据库我们就要写SQL 脚本,常用的做法是现在Microsoft Sql Server Management ...

  10. INNO SETUP数据库的连接与创建

    原文:INNO SETUP数据库的连接与创建 说明一下:这块程序的前半部分在INNO SETUP的实例里面就有,而后面如果对数据库进行备份和还原在实例里面没有,在网上也不好找,是本人费了好大劲一句一句 ...