守护进程概述

守护进程守护进程,说白了,就是 能够一直存在,不随着用户等的登入或登出,和整个 操作系统一起运行,在系统启动时开启,在其关闭时终止的进程。守护进程的特性1. 在后台上运行守护进程最重要的特征,便是在后台运行,不随终端的打开关闭与用户的登入登出而关闭打开为避免挂起控制终端,要将 daemon 放入后台执行,其方法是,在进程中调用 fork 使父进程终止,让daemon在子进程中后台执行。具体就是调用 fork ,然后使父进程 exit 。这样做实现了下面几点:第一,如果该精灵进程是由一条简单 sh
摘要由CSDN通过智能技术生成

守护进程

守护进程,说白了,就是 能够一直存在,不随着用户等的登入或登出,和整个 操作系统一起运行,在系统启动时开启,在其关闭时终止的进程。

守护进程的特性

1. 在后台上运行

守护进程最重要的特征,便是在后台运行,不随终端的打开关闭与用户的登入登出而关闭打开
为避免挂起控制终端,要将 daemon 放入后台执行,其方法是,在进程中调用 fork 使父进程终止,让daemon在子进程中后台执行。具体就是调用 fork ,然后使父进程 exit 。这样做实现了下面几点:
第一,如果该精灵进程是由一条简单 shell 命令起动的,那么使父进程终止使得 shell 认为这条命令已经执行完成。
第二,子进程继承了父进程的进程组 ID ,但具有一个新的进程 ID ,这就保证了子进程不是一个进程组的首进程。这对于下面就要做的 setsid 调用是必要的前提条件。

2. 脱离原先的控制终端,登录会话和进程组(必须与之前的运行环境隔离开来!!! 3,4,5 其实都属于和之前的运行环境隔离开,这里分开来讲述!)

创建守护进程,必须与其之前的运行环境隔离开来,这些环境包括未关闭的 文件描述符,控制终端,会话组及进程组、工作目录及文件创建掩码等。 而这些环境,通常是由其父进程继承而来的。
(登录会话可以包含多个进程组,这些进程组共享一个控制终端,这个控制终端通常是创建进程的登录终端、控制终端,登录会话和进程组通常是从父进程继承下来的。)
可以调用 setsid() 使得 子进程成为 新的会话组的组长, setsid 要求 让成为新会话组组长的进程,不能已经是一个进程组组长,所以,此处也必须为 子进程。

作用:
(1)让进程摆脱原会话的控制
(2)让进程原进程组的控制
(3)让进程摆脱原控制终端的控制

关于为什么要求 setsid 不能是将进程组组长设为 会话:
https://blog.csdn.net/liuxingen/article/details/45586793

为什么setsid要有这个前提条件呢?
 我们先假设没有这个前提,那么当我们的示例调用完成以后我们会新建一个会话,会话ID等于17641,我们还新建一个已经存在的进程组17461(这是第一个错误)。
  假设17461这个进程组中还包含有其它的进程17464,当我们调用完成以后我们发现同一个进程组中的两个进程17461和17464分别属于两个不同的会话17461和17359(这是第二个错误)。

3. 禁止进程重新打开控制终端

守护进程,已经是一个无终端的会话组组长,但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端

4. 改变当前工作目录

将当前的工作目录更改为根目录,从父进程继承而来的当前工作目录,可能在一个 装配的文件系统中,因为守护进程需要能够于系统一同 启动,关闭,所以,不能放在有依赖,需要等待系统 装配的工作目录(文件目录)下,使用 chdir(“目录”) 改变 守护进程的工作目录,一般直接放到 根目录下( \ )

5. 关闭打开的文件描述符

进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在地文件系统无法卸下以及无法预料的错误。一般来说,必要的是关闭0、1、2三个文件描述符,即标准输入、标准输出、标准错误。因为我们一般希望守护进程自己有一套信息输出、输入的体系,而不是把所有的东西都发送到终端屏幕上。

######## 1. umask() 设置为 0 , 让这个进程,可以有最大的文件操作权限,因为它永远不退出,所以它打开文件以后,其他也打开就会有问题,赋予此进程最大权限,能够操作文件,不会因为权限不足导致不能写入,或者保存等等。
umask是什么?https://blog.csdn.net/tanggao1314/article/details/52168237

umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将程序添加到守护进程中,可以按照以下步骤进行操作: 1. 编写程序:首先,编写你的程序,并确保它可以作为一个独立的进程运行。这可能涉及到设置正确的环境变量、导入所需的库和模块,以及定义程序的主要功能。 2. 创建守护进程:在你的程序中,需要编写代码来创建守护进程。在 Python 中,你可以使用 `daemon` 属性来设置进程为守护进程。例如: ```python import daemon with daemon.DaemonContext(): # 运行你的程序代码 ``` 这将确保你的程序在后台以守护进程的方式运行。 3. 将程序设置为自启动:如果你希望在系统启动时自动启动你的守护进程,你需要将其添加到系统的自启动项中。具体步骤可能因操作系统而异。例如,在 Linux 上,你可以创建一个 systemd 服务单元文件,然后将其放置在 `/etc/systemd/system/` 目录下。 服务单元文件示例(`mydaemon.service`): ``` [Unit] Description=My Daemon After=network.target [Service] ExecStart=/path/to/your/program.py Restart=on-failure [Install] WantedBy=multi-user.target ``` 然后,运行以下命令启用和启动服务: ``` sudo systemctl enable mydaemon sudo systemctl start mydaemon ``` 这样,你的守护进程将在系统启动时自动运行。 请注意,以上步骤只提供了一个基本的概述,具体实现可能会因操作系统和需求而有所不同。在实际操作中,你可能需要进一步了解相关文档和资源,并根据自己的需求进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值