守护进程

2023-05-16

本博客为本人学习UNIX高级环境编程总结。

13 守护进程

13.1 简介

守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多守护进程,他们执行日常事务活动。

13.2 守护进程的特征

系统进程依赖于操作系统实现。父进程ID为0的各进程通常是内核进程,它们作为系统引导装入过程的一部分而启动。(init是个例外,它是一个由内核在引导装入时启动的用户层次的命令。)内核进程是特殊的,通常存在于系统的整个生命期中。它们以超级用户特权运行,无控制终端,无命令行。在ps的输出实例中,内核守护进程的名字出现在方括号中。

对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常有它自己的内核守护进程。如Linux中:

²  Kswapd守护进程也称为内存换页守护进程。它支持虚拟内存子系统在经过一段时间后将脏页面慢慢地写回磁盘来回收这些页面

²  Flush守护进程在可用内存达到设置的最小阈值时将脏页面冲洗至磁盘。它也定期地将脏页面冲洗回磁盘来减少在系统出现故障时发生的数据丢失。多个冲洗守护进程可以同时存在,每个写回的设备都有一个冲洗守护进程。

²  Sync_supers守护进程定期将文件系统元数据冲洗至磁盘

²  Jdb守护进程帮助实现了ext4文件系统中的日志功能

上面的四个进程是内核守护进程

Init进程是一个系统守护进程,除了其他工作外,主要负责启动各运行层次特定的系统服务。这些服务通常是它们自己拥有的守护进程的帮助下实现的。

Rpcbind守护进程提供将远程调用(Remote ProcedureCall,RPC)程序号映射为网络端口号的服务。Rsyslogd守护进程可以被由管理员启用的将系统消息记入日志的任何程序使用。可以在一台实际的控制台上打印这些消息,也可以将他们写到一个文件中。

Inet守护进程,它侦听系统网络接口,以便取得来自网络的对各种网络服务进程的请求。Nfsd,nfsiod,lockd,rpciod,rpc.idmapd,rpc.statd和rpc.mountd守护进程提供对网络文件(Network File System,NFS)的支持。

上面的三个是用户级守护进程

²  Cron守护进程在定期安排的日期和时间执行命令。许多系统管理任务是通过cron每隔一段固定的时间就运行相关程序而得以实现的

²  Atd守护进程与cron类似,它允许用户在指定的时间执行任务,但是每个任务它只执行一次,而非在定期安排的时间反复执行

²  Cupsd守护进程是个打印假脱机进程,它处理对系统提出的各个打印请求

²  Ssh守护进程提供了安全的远程登录和执行设施

注意:大多数的守护进程都以超级用户(root)特权运行。所有的守护进程都没有控制终端,其终端名设置为问号。内核守护进程以无控制终端方式启动。用户层守护进程缺少控制终端可能是守护进程调用了setsid的结果。大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话组和会话中的唯一进程(rsyslogd是一个例外)。最后,应当引起注意的是用户层守护进程的父进程是init进程。

13.3 编程规则

在编写守护进程程序时,需要遵循一些基本规则,以防止产生不必要的交互作用。下面先说明这些规则,然后给出一个按照这些规则编写的函数daemonize。

²  首先要做的是调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)。由继承得来的文件模式创建屏蔽字可能会被设置为拒绝默写权限。如果守护进程要创建文件,那么他可能要设置特定的权限。如若守护进程要创建组可读、组可写的文件,继承的文件模式创建屏蔽字可能会屏蔽上述两种权限中的一种,而使其无法发挥作用。另一方面,如果守护进程调用的库函数创建了文件,那么将文件模式创建屏蔽字设置为一个限制性更强的值(如007)可能会更明智,因为库函数可能不允许调用者通过一个显示的函数参数来设置权限。

²  调用fork,然后使父进程exit。这样做实现了下面几点:

n  如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕

n  虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。这是下面setsid调用的先决条件。

²  调用setsi创建一个新会话。然后执行一些步骤来使调用进程:

n  成为新会话的首进程

n  成为一个新进程组的组长进程

n  没有控制终端

²  将当前目录更改为根目录。从父进程处继承过来的当前工作目录可能在一个挂载的文件系统中。因为守护进程通常在系统再引导之前是一直存在的,所以如果守护进程的当前工作目录在一个挂载文件系统中,那么该文件系统就不能被卸载。

或者,某些守护进程可能会把当前工作目录更改到某个指定位置,并在此位置进型他们的全部工作。如,形式打印机假脱机守护进程就可能将其工作目录更改到他们的spool目录上。

²  关闭不在需要的文件描述符。这使守护进程不再持有从其父进程继承来的任何文件描述符(父进程可能是shell进程,或某个其他进程)。可以使用open_max函数或getrlimit函数来断定最高文件描述符值,并关闭直到该值的所有描述符。

²  某些守护进程打开/dev/null使其具有文件描述符0、1、2,这样,任何一个试图读标准输入、写标准输入或标准错误的库例程都不会产生任何效果。因为守护进程并不与终端设备相关联,所以其输出无处显示,也无处从交互式用户那里接收输入。即使守护进程是从交互式会话启动的,但是守护进程是在后台运行的,所以登录会话的终止并不影响守护进程。如果其他用户在同一终端设备上登录,则不希望在该终端上见到守护进程的输出,用户也不期望他们在终端上的输入被守护进程读取。

守护进程在一个孤儿进程组中,它不是会话首进程,因此没有几乎被分配到一个控制终端。

13.4 出错记录

守护进程存在的一个问题是如何处理出错消息。因为它本就不应该有控制终端,所以不能只是简单的写到标准错误上。我们不希望所有守护进程都写到控制台设备上,因为在很多的工作站上,控制台设备都运行着一个窗口系统。我们也不希望每个守护进程将它自己的出错信息写到一个单独的文件中。对任何一个系统管理人员而言,如果关系哪一个守护进程写到哪一个记录文件中并定期地检查这些文件,那么一定会使他感到头痛。故需要一个集中的守护进程出错记录设施

自BSD依赖,BSD的syslog设施得到广泛的应用。大多数守护进程都是用这一设施。

产生日志的方法有3种:

²  内核例程可以调用log函数。任何一个用户进程都可以通过打开(open)并读取(read)/dev/klog设备来读取这些消息。

²  大多数用户进程(守护进程)调用syslog(3)函数来产生日志消息。调用相关序列,使消息被发送至UNIX域数据报套接字/dev/log

²  无论一个用户进程是在次主机上,还是在通过TCP/IP网络连接到此主机的其他主机上,都可将日志消息发向UDP端口514。注意:syslog函数从不产生这些UDP数据报,它们要求产生此日志消息的进程进行显示的网络编程。

通常syslogd守护进程读取所有3种格式的日志消息。此守护进程在启动时读一个配置文件,其文件名一般为/etc/syslog.conf,该文件决定了不同种类的消息发送向何处。

13.5 单实例守护进程

为了正常运行,某些守护进程会实现为,在任一时刻只运行该守护进程的一个副本。如这种守护进程可能需要安排它访问一个设备。对cron守护进程而言,如果同时有多个实例运行,那么每个副本都可能试图开始某个预定的操作,于是造成该操作的重复执行,这很可能导致出错。

如果守护进程需要访问一个设备,而该设备驱动程序有时会阻止要想多次打开/dev目录下相应的设备节点的尝试。这就限制了在一个时刻只能运行守护进程的一个副本。但是如果没有这种设备可供使用,那么我们就需要自行处理。

文件和记录锁机制为一种方法提供了基础,该方法保证一个守护进程只有一个副本在运行。如果每一个守护进程创建一个固定名字的文件,并在该文件的整体上加一把锁,那么只允许创建一把这样的锁。在此之后创建写锁的尝试都会失败,这向后续守护进程副本指明一个副本正在运行。

文件和记录锁提供了一种方便的互斥机制。如果守护进程在一个文件的整体上得到一把写锁,那么在该守护进程终止时,这把锁将被自动删除。这就简化了复原所需的处理,去除了对以前守护进程实例需要进行清理的有关操作。

13.6 守护进程的惯例

在UNIX系统中,守护进程遵循下列惯例。

²  若守护进程使用锁文件,那么该文件通常存储在/var/run目录中。然而需要注意的是,守护进程可能需要具有超级用户权限才能在此目录下创建文件。锁文件的名字通常是name.pid,其中,name是该守护进程或服务的名字。如cron守护进程锁文件的名字是/var/run/crond.pid

²  若守护进程支持配置选项,那么配置文件通常放在/etc目录中。配置文件的名字通常是name.conf,其中,name是该守护进程或服务的名字。如syslogd守护进程的配置文件通常是/etc/syslog.conf

²  守护进程可用命令行启动,但通常它们是由系统初始化脚本之一(/etc/rc*或/etc/init.d/*)启动的。如果在守护进程终止时,应当自动地重新启动它,则我们可在/etc/inittab中为该守护进程包括respawn记录项,这样,init就将重新启动该守护进程。(假定系统使用System V风格的init命令)

²  若一个守护进程有一个配置文件,那么当该守护进程启动时会读该文件,但在此之后一般就不会在查看它。若某个管理员更改了配置文件,那么该守护进程可能需要被停止,然后再启动,以使配置文件的更改生效。为了避免此种麻烦,某些守护进程并不与终端相结合,它们或是无控制终端的会话首进程,或是孤儿进程组的成员,所以守护进程没有理由期望接受SIGHUP。于是,守护进程可以安全地重复使用SIGHUP。

13.7 客户进程-服务器进程模型

守护进程常常用作服务器进程。用户进程(客户端进程)用UNIX域数据报套接字向其发送消息。

一般而言,服务器进程等待客户进程与其联系,提出某种类型的服务要求。

客户进程与服务器进程通信可以是单向的,也可以是双向的。单向指:客户进程向服务器进程发送服务请求后,服务器进程则不向客户进程回送任何消息。双向指:客户进程向服务器进程发送请求,服务器进程则向客户进程回送应答。

在服务器进程中调用fork然后执行exec另一个程序来向客户进程提供服务较常见。这些服务器进程通常管理着多个文件描述符:通信端点、配置文件、日志文件和类似的文件。最好的情况下,让子进程中的这些文件描述符保持打开状态并无大碍,因为他们很可能不会被子进程中执行的程序所使用,尤其是那些与服务器端无关的程序。最坏的情况下,保持它们的打开状态会导致安全问题——被执行的程序可能有一些恶意行为,如更改服务器端配置文件或欺骗客户端程序使其认为正在与服务器端通信,从而获取未经授权的信息。

解决此问题的一个简单方法是对所有被执行程序不需要的文件描述符设置执行时关闭(close-on-exec)标志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

守护进程 的相关文章

随机推荐

  • Gibbs 采样完整解析与理解

    1 gibbs简析 xff1a gibbs采样需要知道样本中一个属性在其它所有属性下的条件概率 xff0c 然后利用这个条件概率来分布产生各个属性的样本值 gibbs采样属于随机模拟抽样算法中的一种 xff08 一类近似求解的方法 xff0
  • android studio for android learning (十三) 一个简单的图片查看器示例

    1 程序界面很简单 xff0c 一个按钮和一个ImageView组件 xff0c 当用户按下按钮时 xff0c 程序会自动搜寻 assets 目录下的一张图片 2 在android studio中新建的工程并不存在assets目录 xff0
  • 最新关于高德地图定位失败10:定位服务启动、解决办法

    1 定位服务无效 xff0c 并且提示 定位失败 10 定位服务启动失败 2 需要在AndroidManifest中添加 lt service android name 61 34 com amap api location APSServ
  • python中关于图例legend在图外的画法简析

    1 最近遇到一个问题 xff0c 关于图例legend如何画在图外的问题 xff0c 并以适合的比例显示出来 2 首先传统的做法如下 xff0c 这种方式并不能满足我的要求 xff0c 而且是显示在图内 ax1 legend loc 61
  • SVM总结

    http blog csdn net lc013 article details 55195523
  • 排序算法理解浅析

    1 排序算法有很多 xff0c 准确的理解可以帮我们快速实现工程问题 xff0c 一种是比较排序 xff0c 时间复杂度最少可达到O n log n xff0c 主要有 xff1a 冒泡排序 xff0c 选择排序 xff0c 插入排序 xf
  • Java事件处理机制(自定义事件)

    转载地址 xff1a http blog csdn net qq 35101189 article details 61673121 ref 61 myread Java中的事件机制的参与者有3种角色 xff1a 1 event objec
  • Hadoop启动命令

    下载hadoop并解压 配置hdfs 修改配置文件etc hadoop hadoop env sh JAVA HOME 61 home middleware jdk 修改配置文件etc hadoop core site xml lt con
  • Git命令:切换分支 & 下载指定分支命令

    git一般有好多分支 xff0c 最近项目中将master分支代码clone到本地 xff0c 用到一些git命令 xff0c 于是记录一下 1 查看远程分支 git branch a git branch a dev master rem
  • 无人机POS数据中GPS/IMU数据的解析(航向角、俯仰角、翻滚角)

    POS数据参数的介绍 无人机在飞行作业时 xff0c 获取的无人机影像通常会携带配套的POS数据 从而在处理中可以更加方便的处理影像 而POS数据主要包括GPS数据和IMU数据 xff0c 即倾斜摄影测量中的外方位元素 xff1a xff0
  • PyTorch 训练时中遇到的卡住停住等问题

    目录 前言1 PyTorch 训练时在第一个 epoch 的最后一个 batch 卡死 问题描述 可能的原因 解决方法 2 使用命令行运行时 xff0c 卡在第一个 epoch 问题描述 原因分析 解决方法 前言 在实际训练中遇到了各种各样
  • 【CSS】CSS的三种使用方式

    CSS的三种使用方式 CSS内联样式 xff08 行内样式 xff09 内部样式表外部样式表 CSS 网页分成三部分 结构 xff08 HTML xff09 表现 xff08 CSS xff09 行为 xff08 JavaScript xf
  • kubernetes 控制平台和节点之间的通信

    这篇文章也是翻译的官网 xff1a Control Plane Node Communication 这篇文章主要罗列 xff08 catelogs xff09 控制平台 xff08 更确切的说是apiserver xff09 和工作节点
  • LPMS-IG1 IMU内参标定

    LPMS IG1 IMU内参标定流程 1 安装IMU驱动 2 安装标定软件 3 录包 4 标定 IMU驱动安装 参考IMU官网驱动安装流程 xff0c 链接 xff1a https www alubi cn support download
  • WebScarab拦截WebGoat的请求

    第一步 xff1a 配置WebSarab的Proxy xff0c 使得与WebGoat的端口相同 第二部 xff1a 开启WebSarab应用 xff0c 然后开启webGoat http localhost WebGoat attack
  • webpack常见错误的解决办法

    项目列表 1 安装webpacke 在本项目中安装webpack xff0c save dev的意思是将依赖写入项目的package json文件 npm install save dev webpack 安装过程中如果出现类似上述的提示
  • /usr/bin/ld: cannot find -lnvcuvid

    我们在安装cuda后 xff0c 会测试cuda的安装情况 xff0c 在 sample文件夹中sudo make后会出现这样的错误 xff1a usr bin ld cannot find lnvcuvid 而我们的解决方案就是你使用的网
  • UML建模与软件开发设计(六)——类图设计与类之间的关系

    3 2 5 关联关系的分类 然而 xff0c 通过关联关系来描述类与类时还是比较抽象 xff0c 有些关系的细节难以通过关联关系表达出来 xff0c 比如类A与类B的角色定位 数量关系 xff0c 关联方向等都描述得不够清晰准确 xff08
  • 四轴PID讲解

    插播一条DJI招聘信息 常年有效 xff1a 包括控制算法 软件功能开发 SDK 嵌入式软件开发 GNSS接收机设计 测试开发 xff08 包括CI持续集成 xff09 请各位对空中机器人 xff0c 地面机器人 xff0c 教育机器人有兴
  • 守护进程

    本博客为本人学习UNIX高级环境编程总结 13 守护进程 13 1 简介 守护进程 xff08 daemon xff09 是生存期长的一种进程 它们常常在系统引导装入时启动 xff0c 仅在系统关闭时才终止 因为它们没有控制终端 xff0c