当前位置: 首页 > news >正文

Linux守护进程揭秘-无声无息运行在后台


在Linux系统中,有一些特殊的进程悄无声息地运行在后台,如同坚实的基石支撑着整个系统的运转。它们就是众所周知的守护进程(Daemon)。本文将为你揭开守护进程的神秘面纱,探讨它们的本质特征、创建过程,以及如何重定向它们的输入输出。通过C++代码示例,你将领略到守护进程背后的编程哲学。


一、守护进程简介


守护进程顾名思义,就是在系统后台默默守护的进程。它们通常在系统启动时创建,并一直运行至系统关闭,生命周期非常长。常见的守护进程包括cron调度器、SSH服务器(sshd)、Redis数据库、Nginx Web服务器等。

守护进程有两个主要特点:

  1. 在后台运行,没有控制终端。因此内核永远不会为它们生成任何与终端相关的信号,如SIGINT(中断)、SIGTSTP(停止)等。
  2. 不受父进程影响。当创建守护进程时,会让出与父进程的关联,成为一个独立的进程组。

根据这一特性,某些守护程序会将SIGINT和SIGHUP信号视为一种通知机制。

如果守护程序接收到这两个信号,这通常意味着信号是由用户或服务本身触发的。


例如,在nginx中,当我们执行nginx -s reload命令以热更新配置文件时,实际上是向nginx的主进程发送了一个SIGHUP信号。

此外,在Linux系统中,也有一些特定的守护进程以线程的方式运行,例如pdflush,它会定期将缓冲区中的数据刷新到磁盘。


守护进程本质上是一个孤儿进程,其父进程在执行fork()之后会立即终止。因此,守护进程最终会被init进程所收养。同时,孤儿进程本身并没有害处。


二、创建守护进程的过程


在Linux系统中,创建一个守护进程通常遵循一个固定的模板,其过程相对标准化,很难省略其中的任何步骤。


创建守护进程的步骤基本如下:

  1. 分身:父进程fork出子进程,然后父进程退出。

    • 执行一个fork(),创建出子进程之后父进程退出,子进程继续执行,如果守护进程是从shell 中创建的,那么守护进程应该让出终端控制,不能占用。
    • 子进程一定不会作为一个进程组的首进程,才有可能释放与当前终端的所有关联。
  2. 开启新会话:子进程调用setsid()脱离所有终端,创建新会话。

    • 一般情况下,终端下直接运行的进程当终端被关闭时,运行的进程也会退出执行
    • 调用成功后终端是否被关闭将不会影响到子进程的运行。
  3. 更改工作目录:防止意外占用目录。

  4. 重置umask:确保有创建文件/目录的权限。

  5. 关闭已打开文件描述符:包括标准输入/输出/错误,防止影响后续程序运行。

    • 因为标准输入、标准输出以及标准错误和终端相关,而我们的守护进程和任何终端都不产生联系,留着这
3 个文件描述符完全没有必要。
    • 但是我们又不能直接关闭掉这
3 个文件描述符,万一程序在某个地方执行了 printf(),那么就会出现错误。
  6. 重定向标准输入/输出/错误:为日志等做准备。

  7. 处理信号:决定如何响应常见信号。


下面是一段简单的代码,演示了创建守护进程的基本流程:

#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>void daemonize() {// 分身,父进程退出pid_t pid = fork();if (pid < 0) exit(EXIT_FAILURE);if (pid > 0) exit(EXIT_SUCCESS);// 子进程继续,开启新会话if (setsid() < 0) exit(EXIT_FAILURE);// 更改工作目录chdir("/");// 重置umaskumask(0);// 关闭已打开文件描述符for (int i = sysconf(_SC_OPEN_MAX); i >= 0; i--) {close(i);}// 重定向标准输入/输出/错误open("/dev/null", O_RDWR);dup(0);dup(0);
}int main() {daemonize();// 守护进程主循环while (1) {sleep(1);std::cout << "Daemon running..." << std::endl;}return 0;
}

三、输入输出重定向


在这里插入图片描述


你可能已经注意到,上面的代码中我们重定向了守护进程的标准输入/输出/错误流。这是因为终端关闭时,如果进程还持有这些文件描述符,就会收到SIGHUP信号而退出。而我们的守护进程并不希望如此。


重定向的方式是先打开/dev/null(空设备文件),然后使用dup2()系统调用,将标准输入/输出/错误流的文件描述符指向这个空文件。之后守护进程所有的输入输出都将被丢弃,不会影响到正常运行。


在程序内,如果我们想要将
STDIN_FILENO、STDOUT_FILENO 以及
STDERR_FILENO 这
3 个描述符重定向到
/dev/ null 的话,就需要借助
dup2() 这一系统调用 。


int fd = open("/dev/null", O_RDWR);
dup2(fd, STDIN_FILENO);  
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);

如果我们把文件描述符看作是指针的话,那么
dup2(A,
B) 的作用就是把
A
指向的东西给到
B,让
B的指向和
A
的指向相同。


四、守护万象更新潮流


守护进程作为Linux系统不可或缺的一员,扮演着重要的角色。从上世纪90年代开始,守护进程编程的理念就根深蒂固,影响着整个Linux生态的发展。然而,近年来随着容器和微服务的兴起,传统的守护进程模式也面临着一些挑战和质疑。守护进程的未来将如何演进?它们是否会被新技术所取代?这些都将是值得我们继续关注和探讨的话题。而无论形式如何变迁,稳定、高效、隐身于后台的设计思想,必将patrimony代代相传。


相关文章:

Linux守护进程揭秘-无声无息运行在后台

在Linux系统中&#xff0c;有一些特殊的进程悄无声息地运行在后台&#xff0c;如同坚实的基石支撑着整个系统的运转。它们就是众所周知的守护进程(Daemon)。本文将为你揭开守护进程的神秘面纱&#xff0c;探讨它们的本质特征、创建过程&#xff0c;以及如何重定向它们的输入输出…...

python-Bert(谷歌非官方产品)模型基础笔记0.1.096

python-bert模型基础笔记0.1.015 TODOLIST官网中的微调样例代码Bert模型的微调限制Bert的适合的场景Bert多语言和中文模型Bert模型两大类官方建议模型Bert模型中名字的含义Bert模型包含的文件Bert系列模型参数介绍微调与迁移学习区别Bert微调的方式Pre-training和Fine-tuning区…...

Linux的命令补全脚本

一 linux命令补全脚本 Linux的命令补全脚本是一个强大且高效的工具&#xff0c;它能够极大地提高用户在命令行界面的工作效率。这种脚本通过自动完成部分输入的命令或参数&#xff0c;帮助用户减少敲击键盘的次数并降低出错率。接下来将深入探讨其工作原理、安装方式以及如何自…...

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…...

大型语言模型简介

大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法&#xff0c;可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 文章目录 大型语言模型简介什么是大型语言模型&#xff1f;为什么大型语言模型很重要&#xff1f;什么是大型语言模型示例&#xff1f;大型语…...

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理&#xff1a;管理项目依赖的jar包 &#xff0c;避免版本冲突 2.统一项目结构&#xff1a;比如统一eclipse IDEA等开发工具 3.项目构建&#xff1a;标准跨平台的自动化项目构建方式。有标准构建流程&#xff0c;能快速…...

eclipse连接后端mysql数据库并且查询

教学视频&#xff1a;https://www.bilibili.com/video/BV1mK4y157kE/?spm_id_from333.337.search-card.all.click&vd_source26e80390f500a7ceea611e29c7bcea38本人eclipse和up主不同的地方如下&#xff0c;右键项目名称->build path->configure build path->Libr…...

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例&#xff0c;远程控制命令mstsc...

百度/迅雷/夸克,网盘免费加速,已破!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家安利了百度网盘及迅雷的加速方法&#xff0c;详细方法及获取参考之前文章&#xff1a; 刚刚&#xff01;度盘、某雷已破&#xff01;速度50M/s&#xff01; 本次主要介绍夸…...

SOA的参考架构

1. 以服务为中心的企业集成架构 IBM的Websphere业务集成参考架构&#xff08;如图1所示&#xff0c;以下称参考架构&#xff09;是典型的以服务为中心的企业集成架构。 图1 IBM WebSphere业务集成参考架构 以服务为中心的企业集成采用“关注点分离&#xff08;Separation of Co…...

前端开发-表单和表格的区别

在前端开发中&#xff0c;表单&#xff08;Form&#xff09;和表格&#xff08;Table&#xff09;同样具有不同的用途和结构&#xff1a; 前端表单&#xff08;Form&#xff09;: 数据收集&#xff1a;表单用于收集用户输入的数据&#xff0c;如文本输入、选择选项等。用户交…...

Data Management Controls

Data Browsing and Analysis Data Grid 以标准表格或其他视图格式&#xff08;例如&#xff0c;带状网格、卡片、瓷砖&#xff09;显示数据。Vertical Grid 以表格形式显示数据&#xff0c;数据字段显示为行&#xff0c;记录显示为列。Pivot Grid 模拟微软Excel的枢轴表功…...

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions 前言一. 数据获取 fetch1.1 缓存 caching① 服务端组件使用fetch② 路由处理器 GET 请求使用fetch 1.2 重新验证 revalidating① 基于时间的重新验证② 按需重新验证revalidatePathrevalidateTag 1.3 缓存的退出方式 二. Ser…...

腾讯开源人像照片生成视频模型V-Express

网址 https://github.com/tencent-ailab/V-Express 下面是github里的翻译&#xff1a; 在人像视频生成领域&#xff0c;使用单张图像生成人像视频变得越来越普遍。一种常见的方法是利用生成模型来增强受控发电的适配器。 但是&#xff0c;控制信号的强度可能会有所不同&…...

pytorch使用DataParallel并行化保存和加载模型(单卡、多卡各种情况讲解)

话不多说&#xff0c;直接进入正题。 &#xff01;&#xff01;&#xff01;不过要注意一点&#xff0c;本文保存模型采用的都是只保存模型参数的情况&#xff0c;而不是保存整个模型的情况。一定要看清楚再用啊&#xff01; 1 单卡训练&#xff0c;单卡加载 #保存模型 torc…...

PS初级|写在纸上的字怎么抠成透明背景?

前言 上一次咱们讲了很多很多很多的抠图教程&#xff0c;这次继续。。。最近有小伙伴问我&#xff1a;如果是写在纸上的字&#xff0c;要怎么把它抠成透明背景。 这个其实很简单&#xff0c;直接来说就是选择通道来抠。但有一点要注意的是&#xff0c;写在纸上的字&#xff0…...

Docker面试整理-Docker的网络是如何工作的?

Docker 的网络功能允许容器以多种方式连接到彼此、宿主机以及外部网络。Docker 使用不同的网络驱动来支持这些连接,每种驱动方式都适用于特定的用途。理解 Docker 的网络是如何工作的,可以帮助你更好地设计和管理容器化应用的通信。 Docker 网络驱动 bridge:默认网络驱动。当…...

获得抖音商品评论 API 返回值

公共参数 名称类型必须描述keyString是调用key&#xff08;获取key和密钥​​​​​​​&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes&am…...

Qt | QtBluetooth(蓝牙电脑当服务端+手机当客户端) 配对成功啦

01、前言 没有演示,因为穷,电脑没有带蓝牙,但是已在其他电脑进行演示,可以满足配对,后期再补充和手机进行聊天,如果有聊天的记得私聊我,好处大大滴。02、QtBlueTooth 简介 QtBluetooth 是一个跨平台的蓝牙库,它允许开发者创建在支持蓝牙的设备上运行的应用程序。这个库…...

我找到了全网最低价买服务器的 bug !!!

拍断大腿 周五&#xff0c;放松一下&#xff0c;给大家分享下我最近的事儿&#xff0c;以及带大家薅个&#xff08;可能会有&#xff09;的羊毛。 上个月&#xff0c;家里买了 Apple TV&#xff08;可理解为苹果的电视盒子&#xff09;装了 infuse&#xff08;一个在电视盒子上…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...