首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【转】Java中Runtime.exec的一些事 

0 预备知识 Runtime类是一个与JVM运行时环境有关的Singleton类,有以下几个值得注意的地方: 0.1 Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java...中唯一得到运行时环境的方法。...0.2 Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用到getRuntime方法。 0.3 Runtime中的exit方法是退出当前JVM的方法,估计也是唯一的。...(注意,Java中的Thread都是执行过了就不值钱的哦) 0.5说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。...答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。

3.1K20

容器运行时信息收集技术介绍

执行过程大体如下:runC启动并加入到容器的命名空间,接着以自身("/proc/self/exe")为范本启动一个子进程,最后通过exec系统调用执行用户指定的二进制程序。...这样一来,它实际上绕过了mnt命名空间及chroot对一个进程能够访问到的文件路径的限制。...用户在启动容器时应调用一个指向/proc/self/exe的进程(如docker exec whoc_ctr/proc/self/exe),使runC在容器内重新执行自己。...should be accessible at /proc/self/exe */ /* 作为运行时进程的动态链接时,可以通过/proc/self/exe访问到文件描述符 */...本文通过介绍一种容器运行时收集技术的原理和应用案例,证明即使是看似安全的多租户强边界公有云环境,也可能在某一环节被攻击者收集到敏感信息,并通过该信息发现可能存在的风险然后加以利用,以致云上权限一步步沦陷

58910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux线程调度策略

    每个线程都包含一个调度策略以及一个静态的调度优先级sched_priority,调度器根据系统上所有线程的调度策略和静态优先级来决定如何进行调度。...CBS通过阻止线程超出其运行时间Runtime来保证任务间不互相干扰。 为了确保deadline调度,当SCHED_DEADLINE线程在给定的条件下不可运行时,此时内核必须阻止这些线程的运行。...如果正在运行的进程的nice值为负值,子进程的nice值会被设置为0。...定义了一个CPU使用周期,周期越短,可以越快开始下一个周期 /proc/sys/kernel/sched_rt_runtime_us 该文件中的值指定了实时和deadline调度的进程可以使用的"period...任务组间有继承关系,会继承系统上被称为"root任务组"的初始化任务组。任务组遵循以下条件(按顺序): CPU cgroup中的所有线程为一个任务组。

    4.8K30

    浅析Docker运行安全

    这类似于setuid位的工作方式。线程功能跟踪正在运行的程序中功能的当前状态。 默认情况下,Docker使用白名单方法删除除所需功能之外的所有功能。...PID命名空间提供了进程的分离。PID命名空间删除系统进程视图,允许进程ID可重用,包括pid 1。 在一些情况下需要容器共享主机进程命名空间,基本上允许容器内的进程可以查看主机的所有进程。...UTS 命名空间,禁用—uts=host UTS命名空间用于设置主机名和对该命名空间中正在运行的进程可见的域。...2.18 不共享主机用户命名空间,禁用—users=host 默认情况下,Docker守护程序以root身份运行。这使守护程序可以创建并使用启动容器所需的内核结构。但是,它也存在潜在的安全风险。...int 限制CPU运行时周期(以微秒为单位) —cpu-rt-runtime int 限制CPU实时运行时间(以微秒为单位) -c, —cpu-shares int CPU 共享 (相对权重的设定)

    2.9K10

    Go 程序启动流程

    编辑切换为居中 添加图片注释,不超过 140 字(可选) 编译完后就行执行可执行程序,执行的时候可执行二进制文件会被操作系统加载起来运行,通常分为以下几个阶段: 从磁盘上把可执行程序读入内存; 创建进程和主线程...*他们都是指向ret_amd64(),程序编译为机器码之后, 依赖特定 CPU 架构的指令集,而操作系统的差异则是直接反应在运行时进行不同的系统级操作上。...这里只截取了一部分ret_go的代码,其中前面部分包括了系统相关检查,在 #ifdef 和 #endif 之间,后半部分才是核心启动部分,核心部分包括下面这些点: schedinit:进行各种运行时组件初始化工作...,这包括我们的调度器与内存分配器、回收器的初始化 newproc:负责根据主 goroutine(即 main)入口地址创建可被运行时调度的执行单元,这里的main还不是用户的main函数,是 runtime.main...src/runtime下对应的函数,比如schedinit就是在 src/runtime/proc.go,接着就是各种初始化。

    77620

    Linux进程调度器的设计--Linux进程的管理与调度(十七)

    早先版本中,idle是参与调度的,所以将其优先级设为最低,当没有其他进程可以运行时,才会调度执行 idle 而目前的版本中idle并不在运行队列中参与调度,而是在cpu全局运行队列rq中含idle...* curr: 当前正在运行的sched_entity(对于组虽然它不会在cpu上运行,但是当它的下层有一个task在cpu上运行,那么它所在的cfs_rq就把它当做是该cfs_rq上当前正在运行的...可以看出跟实际运行时间和权重有关,红黑树就是以此作为排序的标准,优先级越高的进程在运行时其vruntime增长的越慢,其可运行时间相对就长,而且也越有可能处于红黑树的最左结点,调度器每次都选择最左边的结点为下一个调度进程...在多核多CPU的情况下,同一进程组的进程有可能在不同CPU上同时运行,所以每个进程组都必须对每个CPU分配它的调度实体(struct sched_entity 和 struct sched_rt_entity...),而红色se则为当前CPU上正在执行的程序,蓝色为下个将要执行的程序,其实图中并不规范,实际上当进程运行时,会从红黑树中剥离出来,然后设定下一个调度进程,当进程运行时间结束时,再重新放入红黑树中。

    3.6K41

    深入了解 Linux 容器调度

    在命名空间中运行的进程可以看到子 pid 命名空间的所有进程。这意味着在根命名空间中运行的进程,例如我们的 shell,可以看到系统上运行的所有进程。...我们可以使用该 docker exec 命令运行交互式 shell,前提是我们的容器有一个用于 shell 的二进制文件。在大多数情况下,此命令是比 nsenter 程序更简单的解决方案。...运行 exec 后,您将看到一个 shell 提示,它与我们的 java 进程共享相同的命名空间,包括 pid 命名空间。...在运行像 JVM 这样的复杂系统时尤其如此,这些系统对运行它的系统做出了许多假设。...因为 JVM 仍然能够看到正在运行的系统上的核心数量,所以它会将垃圾收集器线程的数量调整为主机上的物理核心数量,而不管其配额限制如何。

    83820

    Linux的进程线程及调度

    4) wait() 父进程挂起,等待子进程结束。 5) 孤儿进程与僵尸进程 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。...操作系统此时会将内存区拷贝一份,父子进程看到的虚拟地址仍然一样,但是物理地址已经不则。...各进程虚拟地址到物理地址的映射由MMU(Memory Management Unit, 内存管理单元)管理。 ? fork运行在有MMU的CPU上。 2.2 vfork() ?...内核RT补丁: /proc/sys/kernel/sched_rt_period_us /proc/sys/kernel/sched_rt_runtime_us 在period的时间里RT最多只能跑...vruntime = pruntime/weight × 1024; vruntime是虚拟运行时间,pruntime是物理运行时间,weight权重由nice值决定(nice越低权重越高),则运行时间少

    4.1K41

    Golang 程序启动流程分析

    ,src/cmd/link/internal/ld 包实现了链接器; 二、运行 go 源码通过上述几个步骤生成可执行文件后,二进制文件在被操作系统加载起来运行时会经过如下几个阶段: 1、从磁盘上把可执行程序读入内存...; 2、创建进程和主线程; 3、为主线程分配栈空间; 4、把由用户在命令行输入的参数拷贝到主线程的栈; 5、把主线程放入操作系统的运行队列等待被调度执起来运行; Golang 程序启动流程分析...g0,runtime·g0 是一个全局变量,变量在 src/runtime/proc.go 中定义,全局变量会保存在进程内存空间的数据区,下文会介绍查看 elf 二进制文件中的代码数据和全局变量的方法...tls 和 m0,tls 为线程本地存储,在 golang 程序运行过程中,每个 m 都需要和一个工作线程关联,那么工作线程如何知道其关联的 m,此时就会用到线程本地存储,线程本地存储就是线程私有的全局变量...在后面代码分析中,会经常看到调用 getg 函数,getg 函数会从线程本地存储中获取当前正在运行的 g,这里获取出来的 m 关联的 g0。

    1.5K10

    CFS 调度器数据结构篇

    pick_next_task: 在运行队列中选择下一个最合适的进程来运行 put_prev_task: 获得当前进程之前的那个进程 set_curr_task: 用来设置当前进程的调度状态等 task_tick...调度是通过红黑树来管理进程的,这个是红黑树的节点 on_rq: 此值为1时,代表此进程在运行队列中 exec_start: 记录这个进程在CPU上开始执行任务的时间 sum_exec_runtime:...记录这个进程总的运行时间 vruntime: 代表的是进程的虚拟运行时间 prev_sum_exec_runtime: 记录前面一个进程的总的运行时间 nr_migrations: 负载均衡时进程的迁移次数...statistics:进程的统计信息 红黑树 红黑树大家肯定不陌生了,树左边节点的值永远比树右边接的值小。...nr_running: 代表这个运行队列上总的运行进程数 load: 在这个CPU上所有进程的权重,这个CPU上可能运行的进程有实时进程,普通进程等 nr_switches: 进程切换的统计数 struct

    1.3K10

    【容器安全系列Ⅰ】- 以进程视角探索容器

    让我们首先检查 VM 上是否存在任何活动的nginx进程。ps -fC nginx     这应该返回一个空列表,因为我们目前没有任何 NGINX Web 服务器在运行。...进程现在正在机器上运行。...与容器进程进行交互     我们现在知道容器只是进程,但这对我们如何与它们交互意味着什么?能够将它们作为进程进行交互,对于故障排除和调查正在运行的容器中的变更(例如,在取证调查中)都很有用。...值得一提的是,我们可以使用 /proc 文件系统来获取有关正在运行的容器的更多信息。     Linux 中的/proc文件系统是虚拟或伪文件系统。...在这种情况下,运行将向我们显示如下所示的列表:sudo ls /proc/2336/root     现在,让我们用touch添加一个文件到此目录,我们可以使用docker exec列出容器上的文件来确认它已添加

    15410

    CVE-2019-5736 docker-runc escape 漏洞复现

    还一个 /proc/pid/exe 文件,这个文件指向进程本身的可执行文件。而/proc/self目录则是读取进程本身的信息接口,是一个link,链接到当前正在运行的进程。...它会把新程序加载到当前进程的内存空间内,当前的进程会被丢弃,它的堆、栈和所有的段数据都会被新进程相应的部分代替,然后会从新程序的初始化代码和 main 函数开始运行。...替换可执行文件,意味着释放调用execve()文件的I/O,但这个过程默认是不释放/proc/pid/fd中的打开的文件描述符的。...当我们运行execve()去运行新的可执行文件时。但是当runc结束运行时/proc/pid/exe也会被替换成新的二进制可执行文件。所以我们需要先去获取一个runc得fd文件描述符,并且保留下来。...漏洞利用:接下来我们需要考虑把如何在runc init的时候去执行open操作:1在以后的容器内部执行恶意文件,当再次docker exec -it docker-id /bin/sh时就可以触发覆写攻击流程大致如下

    46420

    深入剖析 Golang 程序启动原理 - 从 ELF 入口点到GMP初始化到执行 main!

    在过去的开发工作中,大家都是通过创建进程或者线程来工作的。Linux进程是如何创建出来的? 、聊聊Linux中线程和进程的联系与区别! 和你的新进程是如何被内核调度执行到的?...这几篇文章就是帮大家深入理解进程线程原理的。 但是,时至今日光了解进程和线程已经不够了。因为现在协程编程模型大行其道。很多同学知道进程和线程,但就是不理解协程是如何工作的。...第一、通过 runtime 中的 osinit、schedinit 等函数对 golang 运行时进行关键的初始化。在这里我们将看到 GMP 的初始化,与调度逻辑。...在 Linux 中每个 CPU 核都有一个 runqueue,来保存着将来要在该核上调度运行的进程或线程。这样调度的时候,只需要看当前的 CPU 上的资源就行,把锁的开销就砍掉了。...这个函数核心有三个逻辑: 第一、通过 runtime 中的 osinit、schedinit 等函数对 golang 运行时进行关键的初始化。在这里我们将看到 GMP 的初始化,与调度逻辑。

    67630

    Linux Kernel调度器的过去,现在和未来

    这种违背正在运行的进程意愿,停止其运行的行为就是所谓的「抢占」。抢占通常可以在定时器中断时发生,当中断发生时,调度器会检查是否需要切换任务,如果是,则会完成进程上下文切换。...进程运行时间,抢占频率都依赖于这些值。rt_priority 则用于实时(real-time)任务; sched_class 表示进程位于哪个调度类; sched_entity 的意义比较特殊。...嵌套的 CFS 调度器运行队列 struct cfs_rq cfs; // 嵌套的实时任务调度器运行队列 struct rt_rq rt; // curr 指向当前正在运行的进程描述符...为了多个处理器上的工作量均衡,CFS 使用了 load 指标来衡量线程和处理器的负载情况。线程的负载和线程的 CPU 平均使用率相关:经常睡眠的线程负载要低于不睡眠的线程负载。...curr)) return; // 计算出调度单元开始执行时间和当前之间的差值,即真实运行时间 delta_exec = now - curr->exec_start;

    2.7K30

    命名空间介绍之四:PID 命名空间的延伸

    该进程的作用与传统 Linux 系统上的 init 进程类似。...因为 PID 为 1,所以该 shell 运行时是 PID 命名空间的 init 进程。 下一个示例是 simple_init.c,运行后成为 PID 命名空间中的 init 进程。...orphan 程序执行 fork() 来创建子进程。当子进程运行时,父进程退出,使得该子进程成为孤儿。子进程执行一个循环,循环将一直持续直到其成为孤儿(即getppid()返回1)。...本例中,我们只看到了两个进程,说明该命名空间中只有两个进程在运行。...当运行上述 ns_child_exec 命令时,我们使用了 -m 选项,会将创建的子进程(运行 simple_init 的进程)放到一个单独的挂载命名空间中。

    2.2K60

    Linux进程调度_linux进程的查看和调度

    宏观上看上去是多个任务并行执行,事实的本质是 CPU 在不断的调度每一个进程,使得每个进程都得以响应,与此同时,还要兼顾不同场景下的响应效率(进程的执行时间)。...如何挑选哪一个进程进入运行状态?...来代表一个进程的运行时间。...抢占的过程分两步,第一步触发抢占,第二步执行抢占,这两步中间不一定是连续的,有些特殊情况下甚至会间隔相当长的时间: 触发抢占:给正在CPU上运行的当前进程设置一个请求重新调度的标志(TIF_NEED_RESCHED...resched_cpu(); ... } RT类的负载均衡基于overload,如果当前运行队列中的RT进程超过一个,就调用push_rt_task()把进程推给别的CPU,在这里会触发抢占

    20.7K10

    吐血整理 | 肝翻 Linux 进程调度所有知识点

    runqueue 运行队列 runqueue 运行队列是本 CPU 上所有可运行进程的队列集合。...设置调度标记 为 CPU 上正在运行的进程 thread_info 结构体里的 flags 成员设置 TIF_NEED_RESCHED。 那么,什么时候设置TIF_NEED_RESCHED呢 ?...CFS调度器就是站在一视同仁的角度解决了这个问题,保证在一个调度周期内每个任务都有执行的机会,执行时间的长短,取决于任务的权重。下面详细看下CFS调度器是如何动态调整任务的运行时间,达到公平调度的。...比如:2个优先级相同的任务在一个 CPU 上运行,那么每个任务都将会分配一半的 CPU 运行时间,这就是要实现的公平。 但现实中,必然是有的任务优先级高,有的任务优先级低。...虚拟运行时间 根据上面进程实际运行时间的公式,可以看出,权重不同的2个进程的实际执行时间是不相等的,但是 CFS 想保证每个进程运行时间相等,因此 CFS 引入了虚拟时间的概念。

    1.9K53

    5种快速查找容器文件系统中文件的方法

    如果你经常使用容器,那么你很有可能希望在某个时刻查看正在运行的容器的文件系统。...方法一:Exec 到容器中 如果你快速搜索如何检查容器的文件系统,你会发现一个常见的解决方案是使用 Docker 命令: docker exec -it mycontainer /bin/bash 这是一个很好的开始...这也是反映任何运行时修改的地方。 MergedDir:文件系统所有层的组合视图。 WorkDir:用于管理文件系统的内部工作目录。...使用容器内进程的宿主 PID,你可以简单地运行: sudo ls /proc//root Linux 已经为你提供了进程挂载命名空间的视图。...我们在 Pixie 怎么用这个 在本博客的开头,我提到了 Pixie 项目需要如何在容器上放置 eBPF 探针。为什么和如何? Pixie 内部的 Stirling 模块负责收集可观察数据。

    79920

    Linux 组调度浅析

    这两个文件规定了,在以sched_rt_period_us为一个周期的时间内,所有实时进程的运行时间之和不超过sched_rt_runtime_us。...这两个文件的默认值是1s和0.95s,表示每秒种为一个周期,在这个周期中,所有实时进程运行的总时间不超过0.95秒,剩下的至少0.05秒会留给普通进程。也就是说,实时进程占有不超过95%的CPU。...而在这两个文件出现之前,实时进程的运行时间是没有限制的(就像《Linux 进程调度浅析》里面描述的那样),如果一直有处于TASK_RUNNING状态的实时进程,则普通进程会一直不能得到运行。...为了实现sched_rt_runtime_us和sched_rt_period_us的逻辑,内核在更新进程的运行时间的时候(比如由周期性的时钟中断触发的时间更新)会给当前进程的调度实体及其所有祖先节点都增加相应的...还有一个问题,前面说到,默认情况下,系统中每秒钟内实时进程的运行时间不超过0.95秒。如果实时进程实际对CPU的需求不足0.95秒(大于等于0秒、小于0.95秒),则剩下的时间都会分配给普通进程。

    3.5K52

    关于Segmentation fault (core dumped)几个简单问题

    有的程序可以通过编译,但在运行时会出现Segment fault(段错误)。这通常都是指针错误引起的。但这不像编译错误一样会提示到文件一行,而是没有任何信息。...如何让一个正常的程序down: #kill -s SIGSEGV pid 8. 察看Core文件输出在何处: 存放Coredump的目录即进程的当前目录,一般就是当初发出命令启动该进程时所在的目录。...三、这个一般都知道,就是要设置足够大的Core文件大小限制了。程序崩溃时生成的 Core文件大小即为程序运行时占用的内存大小。...因此无论程序正常运行时占用的内存多么少,要保证生成Core文件还是将大小限制设为unlimited为好。 四、异常退出就一定会生成core吗? 难道没有不生成core的异常退出?...一般情况下,linux系统是不允许产生core文件的,因此首先要解除这个限制: ulimit -c unlimited 接下来,运行含segmentation fault的段程序,如: .

    11.5K30
    领券