详解Linux中的守护进程

发布时间 - 2026-01-11 02:05:37    点击率:

一、什么是守护进程

Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运⾏结束或⽤户注销时终止,但系统服务进程不受用户登录注销的影响,它们⼀直在运行着。这种进程叫守护进程。

守护进程也被称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
查看方式

ps axj命令:查看系统中的进程。

参数a表示不仅列当前⽤户的进程,也列出所有其他用户的进程;

参数x表示不仅列有控制终端的进程,也列出所有⽆控制终端的进程;

参数j表示列出与作业控制相关的信息;

 二、守护进程的调用

创建守护进程最关键的⼀步是调⽤setsid函数创建⼀个新的会话,并成为会话leader。

该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进 程组的Leader也很容易,只要先fork再调⽤setsid就行了。fork创建的子进程和⽗进程在同⼀个进程组中,进程组的Leader必然是该组的第⼀个进程,所以子进程不可能是该组的第⼀进程,在子进程中调用setsid就不会有问题了。

成功创建并调用一个守护进程的标志是:

1、成功新建一个会话,当前进程成为该会话的leader,该会话的ID为当前进程的ID;

2、成功新建一个新的进程组,并且成为该组的组长,该进程组的组id即为当前进程的id;

3、如果当前进程有一个控制终端,那么当前进程失去这个控制终端,成为一个无控制终端的进程;所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是⼀个普通的打开⽂件⽽不是控制终端了。

三、守护进程的创建

1、使用umask将文件模式创建屏蔽字设置为0;

2、调用fork(),父进程退出(exit)。 (如果该守护进程作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。同时保证该进程不是一个进程组的组长进程)

3、调用setsid创建一个新会话。(setsid会使1、调用进程成为新会话的首进程;2、调用进程成为一个进程组的组长进程;3、调用进程没有控制终端)

4、将当前工作目录更改为根目录;

5、关闭不再需要的文件描述符;

6、忽略SIGCHLD信号;

代码实现mydemon:


除了自己实现外,我们还可以调用系统中的demon进行设置;

进行第二次fork的原因?

要明晰第二次fork的原因,就必须明晰这两次fork的作用。

第一次fork的作用是:1、让shell认为这条命令已经终止,不用挂在终端输入上;

2、为之后的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。(当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。)

(2)第二次fork的作用:

虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有确定会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程。

第二次不是必须的,是可选的,市面上有些开源项目也是fork一次

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Linux  # 守护进程  # 守护进程的实例详解  # linux shell实现守护进程脚本  # php守护进程 加linux命令nohup实现任务每秒执行一次  # linux下如何创建守护进程的步骤  # C语言编写Linux守护进程实例  # Python实现Linux下守护进程的编写方法  # Java实现Linux下双守护进程  # linux 守护进程详解及建立守护进程  # Linux守护进程的启动方法  # linux下的守护进程  # linux守护进程服务daemon、nohup、systemd的区别  # 成为一个  # 用户登录  # 新建一个  # 组组长  # 是在  # 不可能  # 还可以  # 终端设备  # 是指  # 两次  # 也很  # 这条  # 希望能  # 不受  # 被称为  # 可选  # 会使  # 挂在  # 仍然是  # 要先 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解jQuery中基本的动画方法  微信推文制作网站有哪些,怎么做微信推文,急?  使用C语言编写圣诞表白程序  原生JS获取元素集合的子元素宽度实例  高防服务器:AI智能防御DDoS攻击与数据安全保障  网站制作报价单模板图片,小松挖机官方网站报价?  Mybatis 中的insertOrUpdate操作  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  nodejs redis 发布订阅机制封装实现方法及实例代码  如何快速建站并高效导出源代码?  大同网页,大同瑞慈医院官网?  Laravel distinct去重查询_Laravel Eloquent去重方法  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  详解vue.js组件化开发实践  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在阿里云高效完成企业建站全流程?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速打造个性化非模板自助建站?  如何在IIS7上新建站点并设置安全权限?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Thinkphp 中 distinct 的用法解析  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  java中使用zxing批量生成二维码立牌  如何在建站之星绑定自定义域名?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何快速查询网址的建站时间与历史轨迹?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何快速搭建个人网站并优化SEO?  西安专业网站制作公司有哪些,陕西省建行官方网站?  Bootstrap CSS布局之列表  网站建设要注意的标准 促进网站用户好感度!  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】