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

守护进程

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。...创建进程,终止父进程 这是因为守护进程是脱离终端控制的,所以要造成一种在终端里已经运行完的假象,把所有的工作都放在进程中去完成。父进程退出后,进程变成孤儿进程。...在进程中创建新会话 这是因为即使进程已经变成了孤儿进程,但是它始终是被父进程创建出来的,继承了父进程的会话、进程组、控制终端等等。...由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。...关闭文件描述符 用fork新建的进程会从父进程那里继承一些已经开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。

1.8K10

守护进程(daemon)

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。...创建进程,终止父进程 这是因为守护进程是脱离终端控制的,所以要造成一种在终端里已经运行完的假象,把所有的工作都放在进程中去完成。父进程退出后,进程变成孤儿进程。...在进程中创建新会话 这是因为即使进程已经变成了孤儿进程,但是它始终是被父进程创建出来的,继承了父进程的会话、进程组、控制终端等等。...由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。...关闭文件描述符 用fork新建的进程会从父进程那里继承一些已经开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。

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

Linux - 请允许我静静地后台运行

组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程就存在,与组长进程是否已终止无关。...我们要实现后台执行的目的,实际上是要完成如下两个目标: 使进程让出前台终端,让我们可以继续通过终端与系统进行交互。...但我们在使用 nohup php test.php 后会发现,进程还会一直占用前台终端,但即使终端被关闭或连接断开了,程序还是会执行,另外我们会发现在当前文件夹下多了个名为 nohup.out 的文件。...; 代码 以下是 php 创建守护进程的伪代码,另外我的另一篇博客 初探PHP多进程 也稍微介绍了一些相关内容: $pid = pcntl_fork(); if ($pid > 0) { exit...参考: setsid为什么会在脚本中阻塞-StackoOerflow Linux 进程进程组、会话周期、控制终端

1.7K50

linux守护进程

由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成程序已经运行完毕的假象。...之后的所有工作都在进程完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到了与控制终端的脱离,在后台工作。...3)再次 fork() 一个孙进程并让进程退出 为什么要再次fork呢,假定有这样一种情况,之前的父进程fork出进程以后还有别的事情要做,在做事情的过程中因为某种原因阻塞了,而此时的进程因为某些非正常原因要退出的话...由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。...6)在孙进程中关闭任何不需要的文件描述符 同文件权限码一样,用fork函数新建的进程会从父进程那里继承一些已经开了的文件。

3K20

Chaos Mesh® 技术内幕 | 如何注入 IO 故障?

不能满足运行时注入的要求。因为如果目标程序已经开了一些原目标系统的文件,那么新挂载的文件系统只对新 open 的文件有效。(更何况还有上述文件系统路径覆盖的问题)。...为什么呢?如果读者对整个过程的了解已经足够清晰,不妨试着自己思考它的答案。...为什么不使用nsenter 在 chaos-daemon 中,很多需要在目标命名空间中的操作都是通过 nsenter 完成的,比如 nsenter iptables 这样联合使用。...去掉 CLONE_THREAD 之后等待进程死亡的问题 在进程死亡时,会向父进程发送 SIGCHLD 信号通知自己的死亡。...为了解决这个问题,我们使用 subreaper 的机制来让一个进程的父进程死亡时并不是直接将父进程置为 1,而是进程树上得最近的 subreaper。

1.2K00

【Linux系统编程】通过系统调用获取进程标识符 及 创建进程(fork)

那既然bash也是一个进程,那我们能不能把它干掉呢? 我们知道一个进程运行的时候我们可以输入CTRL+c终止这个进程。...3.7 如何理解fork两个返回值的问题 首先大家来思考一个问题:一个函数将要return的时候,它完成的主体功能是否已经执行完了? 当然是的!...比如有一个求和的函数,那当它return的时候,这个和肯定已经求出来了,而return是要把这个结果返回给函数调用的地方。...那对于fork来说: 它是一个系统调用,那其实就是操作系统提供的一个函数嘛。 那在fork最后将要return的时候,那它的主体功能即创建进程当然已经完成了。...所以此时的执行流就已经变成两个了,上面我们也说了,fork成之后,父子进程是共享代码的。 那对于fork的return,他也是一句代码,一个语句啊。

19810

一门看懂Node处理CPU密集型任务的方法有哪些

那如果我们的服务真的需要运行CPU密集型任务怎么办?总不能换门语言吧?说好的All in JavaScript呢?...原因就是我们一共开了10个工作进程,主进程在将流量打到进程的时候采用的默认负载均衡策略是round-robin(轮流),因此第10个请求(其实是第11个,因为包括了第一个hard_work的请求)刚好回到第一个...概念介绍 Child Process可以让我们启动进程完成一些CPU密集型任务。...这里值得注意的是当进程完成任务后我没有释放进程的资源,在实际项目里面我们也不应该频繁创建和销毁进程因为这个消耗也是很大的,更好的做法是使用进程池。...运行上面master_process.js的代码,我们可以发现即使调用了/hard_work接口,我们还是可以任意调用/easy_work接口并且马上得到响应的,此处没有截图,过程大家脑补一下就可以了。

67840

MIT 6.S081 教材第七章内容 -- 调度 -- 中

我们不能让这里的任何一件事情发生。 另一个问题是,即使一个线程调用了exit系统调用,并且是自己决定要退出。它仍然持有了运行代码所需要的一些资源,例如它的栈,以及它在进程表单中的位置。...当它还在执行代码,它就不能释放正在使用的资源。所以我们需要一种方法让线程能释放最后几个对于运行代码来说关键的资源。 记住这两个问题。 XV6有两个函数与关闭线程进程相关。...这些代码我一年前还记得是干嘛的,现在已经记不太清了。它应该是处理这种父进程进程同时退出的情况。如果不是这种情况的话,一切都会非常直观,进程会在后面通过wakeup函数唤醒父进程。...这里我想要强调的是,直到进程exit的最后,它都没有释放所有的资源,因为它还在运行的过程中,所以不能释放这些资源。相应的其他的进程,也就是父进程,释放了运行进程代码所需要的资源。...如果这样的话,我们不能就这样杀掉进程,因为这样会使得一些需要多步完成的操作只执行了一部分。所以kill系统调用不能就直接停止目标进程运行

16810

数据结构与算法在前端领域的应用 - 换个视角看前端

(图来自 https://zhuanlan.zhihu.com/p/47407398) 这也是为什么 chrome 明明只打开了一个 tab,却出现了 4 个进程的原因。...实际上工作工作进程,尤其是WebWorker已经出现很长时间了。但是很多时候我们并没有充分使用,甚至连使用都没使用。 下面以Web Worker为例, 我们来深度挖掘一下工作线程的潜力。...关于调和算法可以参考我的另外一篇文章前端领域的数据结构与算法解读 - fiber 我们有没有可能将这部分内容抽出主线程,交给工作进程,就像上面的图展示的那样呢?...比如状态机,时光机,自动完成,差异比对算法等等。 如果将这些抽出我们主线程的话,我们的应用大概会是这样的: ?...对于函数序列化这个问题,我们无法传递函数给工作线程,其实上面提到的 Comlink, 就很好地解决了这个问题,即使用Comlink提供的 proxy, 你可以将一个代理传递到工作线程。

69130

go语言调度器源代码情景分析之四:函数调用栈

操作系统把磁盘上的可执行文件加载到内存运行之前,会做很多工作,其中很重要的一件事情就是把可执行文件中的代码,数据放在内存中合适的位置,并分配和初始化程序运行过程中所必须的堆栈,所有准备工作完成后操作系统才会调度程序起来运行...来看一下程序运行时在内存中的布局图: ? 进程在内存中的布局主要分为4个区域:代码区,数据区,堆和栈。在详细讨论栈之前,先来简单介绍一下其它区域。...当发生函数调用时,因为调用者还没有执行完,其栈内存中保存的数据还有用,所以被调用函数不能覆盖调用者的栈帧,只能把被调用函数的栈帧“push”到栈上,等被调函数执行完成后再把其栈帧从栈上“pop”出去,这样...因为C、B两个函数已经执行完成并返回到了A函数之中,所以C、B两个函数的栈帧就已经被POP出栈了,也就是说它们所消耗的栈内存被自动回收了。...从上图可以看出,即使是同一个函数,每次调用都会产生一个不同的栈帧,因此对于递归函数,每递归一次都会消耗一定的栈内存,如果递归层数太多就有导致栈溢出的风险,这也是为什么我们在实际的开发过程中应该尽量避免使用递归函数的原因之一

1.1K10

【Linux修炼】15.进程间通信

1.2 为什么要有通信 在之前所写的C/C++代码中,都是单进程的。但实际上,我们在完成某种业务内容时是需要多进程协同的。...,举个例子:如果发送是1,就让进程下载,发送是2,就让进程做特定的计算……;那为什么可以这样随意控制进程是否运行呢?...操作系统会自己识别文件已经被打开了,就不再需要这个操作了。实际上这也是操作系统为了减轻没必要的性能损失。...,运行观察一下结果: 再次创建就会失败,因为文件已经存在。...server,再运行client,观察server端的变化: 通过这个现象就可以看出,我们将读的一段打开了,他不会直接运行,而是阻塞到读端,当把写端打开了,他才会继续向下运行

43200

PHP 编写守护进程

创建步骤 创建进程,终止父进程 由于守护进程是脱离控制终端的,因此首先创建进程,终止父进程,使得程序在 shell 终端里造成一个已经运行完毕的假象。...之后所有的工作都在进程完成,而用户在 shell 终端里则可以执行其他的命令,从而使得程序以僵尸进程形式运行,在形式 I 上做到了与控制终端的脱离。...由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如 “/” 或 “/tmp” 等。改变工作目录的常见函数是 chdir。...设置文件创建掩码的函数是 umask,通常的使用方法为 umask (0)。 关闭文件描述符 用 fork 新建的进程会从父进程那里继承一些已经开了的文件。...这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。 直接上代码 注:运行环境是 linux 系统,并且要在 cli 模式下运行

1.6K20

Linux进程控制

那么,为什么会这样?接下来我们好好地讨论一下fork函数。 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程进程,而原进程为父进程。...因为在到达return指令之前,进程已经被创建好了,并且有可能已经在OS的运行队列当中,准备被调度,因此,此时对于fork函数的这个return指令,不仅仅是被父进程使用,还会给进程拿去使用。...2.另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。 3.最后,父进程派给进程的任务完成的如何,我们需要知道。...如,进程运行完成,结果对还是不对,或者是否正常退出。 4.父进程通过进程等待的方式,回收进程资源,获取进程退出信息 进程等待方法 1.wait方法。 wait()是一个函数。...如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。因为成功的返回值没有必要,都已经替换了进程了,即使返回了,这个值也用不了。

2.4K30

耗时两天,优化失败

在正常运行了几天之后,突然收到了报警,提示popen失败,于是打开了日志,发现有如下提示: popen file failed, id: abc url: http:xxx.txt errno: 12...换句话说,fork()函数为clone父进程的所有资源,这样就能理解为什么当可用内存小于50%的时候,popen()会失败。...当调用完fork()函数后,进程获得父进程的数据空间、堆和栈,但是这是进程单独拥有的,并不和父进程共享,因此修改进程的变量不会影响父进程的变量。父进程进程共享正文段。...vfork()用于创建一个新进程,而新进程的目的是exec一个新程序。vfork()会挂起父进程直到进程终止或者运行了一个新的可执行文件的映像。...最重要的一个原因是使用fork()的popen(),在创建进程的时候会进行资源复制,即使使用写时复制技术,如果没有足够的内存来复制父进程使用的内存,fork也会失败。

48120

fork,wait和exec

fork,wait和exec fork系统调用 wait系统调用 exec系统调用 为什么要把fork和exec分开 ---- fork系统调用 1、进程不会从 main()函数开始执行,而是直接从...2、进程拥有自己的地址空间(即拥有自己的私有内存)、寄存器、程序计数器等 3、父进程获得的返回值是新创建进程的 PID,而进程获得的返回值是 0 4、进程和父进程运行顺序取决于CPU调度顺序...但是,我们常常想运行不同的程序,exec()正好做这样的事 这个例子中,进程调用 execvp()来运行字符计数程序 wc。...因此,它并没有创建新进程,而是直接将当前运行的程序(以前的 p3)替换为不同的运行程序(wc)。进程执行 exec()之后,几乎就像p3.c 从未运行过一样。...shell 实现结果重定向的方式也很简单,当完成进程的创建后,shell在调用exec()之前先关闭了标准输出(standardoutput),打开了文件newfile.txt。

97120

iOS面试资料参考答案总结

我们不能在非主线程将内容绘制到layer的context上,但我们单独开一个线程通过 CGBitmapContextCreateImage() 绘制内容,绘制完成之后切回主线程,将内容赋值到contents...以阴影为例,为什么它会导致屏渲染。因为GPU的渲染是遵循“画家算法”,一层一层绘制的,但阴影很特殊,它需要全部内容绘制完成,再根据外轮廓进行绘制。...Runloop就是一个运行循环,它保证了在没有任务的时候线程不退出,有任务的时候即使响应。Runloop跟线程,事件响应,手势识别,页面更新,定时器都有着紧密联系。...缓存高度 异步渲染 减少屏渲染 2、Xcode的Instruments都有哪些调试的工具? Activity Monitor(活动监视器):监控进程的CPU、内存、磁盘、网络使用情况。...,选择合适的寻址方式,如果开启了bitcode,会做进一步的优化 汇编:由汇编器生成汇编语言 机器码:由汇编语言转成机器码,生成.o文件 应用启动的流程: 启动的前提是完成编译,运行程序即运行编译过后的目标程序

1.5K40

浏览器原理 - 事件循环

程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 进程 每个应用至少有一个进程进程之间相互独立,即使要通信,也需要双方同意。 何为线程?...有了进程后,就可以运行程序的代码了。 运行代码的「人」称之为「线程」。 一个进程至少有一个线程,所以在进程开启后会自动创建一个线程来运行代码,该线程称之为主线程。...浏览器进程 可以在浏览器的任务管理器中查看当前的所有进程 其中,最主要的进程有: 浏览器进程 主要负责界面显示、用户交互、进程管理等。浏览器进程内部会启动多个线程处理不同的任务。...…… 思考题:为什么渲染进程不适用多个线程来处理这些事情?...当其他线程完成时,将事先传递的回调函数包装成任务,加入到消息队列的末尾排队,等待主线程调度执行。 在这种异步模式下,浏览器永不阻塞,从而最大限度的保证了单线程的流畅运行。 JS 为何会阻碍渲染?

1.7K30

100个Linux命令(7)-进程管理

根据状态码这个"信号",父进程bash知道了进程已经终止,所以通告给内核,内核收到通知后将进程列表中的cp进程项删除。至此,整个cp进程正常完成。...显然,上面所说的bash内置命令不是在shell中运行的。其他的所有方式,都是在shell中完成,只不过方式不尽相同。...它对于后台服务程序而言,传达了几个意思:(1)当前已经运行进程不再接受新请求(2)给当前正在运行进程足够多的时间去完成正在处理的事情(3)允许启动新进程接受新请求(4)可能还有日志文件是否应该滚动、...再来说说,为什么后台服务程序可以使用这两个信号。...同理,USR1和USR2也是一样的,如果源代码中明确为这两个信号注册了对应函数,那么发送这两个信号就可以实现对应的功能,反之,如果没有注册,则这两个信号对进程来说是错误信号。

1.7K20
领券