【Linux】【守护进程】总结整理

守护进程(Daemon)是运行在后台的进程,通常没有与之关联的控制终端。守护进程在启动后会脱离控制终端,并继续在后台运行,即使用户退出登录或者终端关闭也不会影响它们的运行。守护进程常用于提供网络服务、定期执行任务或监控系统状态等。

b36c18698108474cbdf914b837796543.jpeg

守护进程的特点

  • 无控制终端:守护进程没有控制终端,这意味着它们通常不能接收来自终端的输入或输出。
  • 运行在后台:守护进程在后台运行,即使用户退出登录或关闭终端,守护进程仍然持续运行。
  • 长期运行:守护进程通常设计为长期运行,直到手动停止或系统重启。
  • 自动重启:有些守护进程会在意外终止后自动重启,以确保服务的连续性。

创建守护进程的步骤

创建守护进程通常涉及以下步骤:

  1. 创建子进程:使用fork()创建一个子进程。
  2. 成为会话领导者:在子进程中调用setsid()函数,使子进程成为一个新的会话的领导者,并与控制终端脱离。
  3. 改变当前工作目录:通常将当前工作目录更改为根目录/,以避免由于当前目录被卸载而导致的问题。
  4. 重设文件权限掩码:通常使用umask(0)设置文件权限掩码,这样守护进程创建的文件具有最宽松的权限。
  5. 关闭标准文件描述符:关闭标准输入、输出和错误文件描述符(通常是0、1和2),以防止这些描述符引用到已关闭的终端设备。
  6. 可能的第二次fork:为了确保守护进程不会保留任何进程组ID,有时会再次调用fork(),并在父进程中exit(),这样可以确保子进程不会成为一个作业控制进程。

示例代码

以下是一个简单的守护进程创建示例,使用 C 语言编写:

1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <sys/types.h>
5#include <fcntl.h>
6#include <signal.h>
7#include <sys/stat.h>
8#include <errno.h>
9
10void become_daemon() {
11    pid_t pid;
12    int i;
13
14    // 第一次fork
15    pid = fork();
16    if (pid < 0) {
17        fprintf(stderr, "fork #1 failed: %d (%s)\n", errno, strerror(errno));
18        exit(EXIT_FAILURE);
19    }
20    if (pid > 0) {
21        // 父进程退出
22        exit(EXIT_SUCCESS);
23    }
24
25    // 成为会话领导者
26    if (setsid() < 0) {
27        fprintf(stderr, "setsid failed: %d (%s)\n", errno, strerror(errno));
28        exit(EXIT_FAILURE);
29    }
30
31    // 第二次fork
32    pid = fork();
33    if (pid < 0) {
34        fprintf(stderr, "fork #2 failed: %d (%s)\n", errno, strerror(errno));
35        exit(EXIT_FAILURE);
36    }
37    if (pid > 0) {
38        // 父进程退出
39        exit(EXIT_SUCCESS);
40    }
41
42    // 改变当前工作目录
43    if ((chdir("/")) < 0) {
44        fprintf(stderr, "chdir failed: %d (%s)\n", errno, strerror(errno));
45        exit(EXIT_FAILURE);
46    }
47
48    // 重设文件权限掩码
49    umask(0);
50
51    // 关闭标准文件描述符
52    for (i = 0; i < 3; i++) {
53        close(i);
54    }
55
56    // 打开/dev/null作为新的标准文件描述符
57    open("/dev/null", O_RDWR);
58    dup2(0, 1);
59    dup2(0, 2);
60}
61
62int main() {
63    become_daemon();
64
65    // 守护进程的主要逻辑
66    while (1) {
67        printf("守护进程正在运行...\n");
68        sleep(5);
69    }
70
71    return 0;
72}

注意事项

  • 守护进程应该能够处理信号,特别是SIGTERMSIGHUP信号。SIGTERM通常用于请求守护进程优雅地终止,而SIGHUP通常用于通知守护进程重新加载配置文件。
  • 如果守护进程需要记录日志,通常会将日志写入到一个文件中,而不是标准输出。
  • 守护进程通常需要通过命令行参数或配置文件来接受配置选项。
  • 在某些情况下,守护进程还需要处理SIGCHLD信号,以确保子进程的资源被正确清理。
  • 守护进程应该具有良好的错误处理机制,确保即使在遇到问题时也能稳定运行。

守护进程是操作系统中一个重要的组件,用于提供后台服务和支持功能。理解和掌握如何创建和管理守护进程对于开发系统服务和工具非常重要。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud微服务:构建弹性、可扩展的分布式系统

Spring Cloud微服务&#xff1a;构建弹性、可扩展的分布式系统 在当今的软件开发领域&#xff0c;微服务架构已经成为构建复杂应用的首选方案。微服务架构通过将应用拆分为多个独立的服务&#xff0c;每个服务专注于单一的业务功能&#xff0c;从而提高了系统的可维护性、可扩…

vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装

一、下载 html2Canvas jspdf npm install jspdf html2canvas二、封装转换下载方法 htmlToPdf.js import html2Canvas from html2canvas import JsPDF from jspdf/*** param {*} reportName 下载时候的标题* param {*} isDownload 是否下载默认为下载&#xff0c;传false不…

Docker配置及简单应用

谈论/理解 Docker 的常用核心部分&#xff0c;以下皆在 Ubuntu 操作系统下进行 1 国内源安装 Docker-ce 1.1 配置 Linux 内核流量转发 因为docker和宿主机的端口映射&#xff0c;本质是内核的流量转发功能&#xff0c;所以要对其进行配置 1.1.1 未配置流量转发 如果没有配置流…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

探索数据科学与大数据技术专业本科生的广阔就业前景

随着信息技术的不断发展&#xff0c;数据科学与大数据技术已经成为各大行业的关键推动力。在这样一个数据驱动的时代&#xff0c;越来越多的企业依赖数据来驱动决策、优化运营和创造价值。因此&#xff0c;数据科学与大数据技术专业的本科生在就业市场上具有广阔的前景和多样的…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…

ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染

一、组件基础 1.什么是ArkTS ArkTS是HarmoyOS优选的助力应用开发的语言&#xff0c;ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步的扩展&#xff0c;继承了TS所有的特性&#xff0c;是TS的超集。 扩展的能力如下&#xff1a; 基本语法 …

连接kafka消息队列报org.apache.kafka.clients.NetworkClient异常

启动kafka后&#xff0c;连接kafka消息队列报org.apache.kafka.clients.NetworkClient异常 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) 检查kafka运行日志&#xff0c;报The broker is trying to join the wrong clu…

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…

大众汽车合肥社招入职笔试测评SHL题库:综合能力、性格问卷、英语口语真题考什么?

大众汽车合肥社招入职笔试测评包括综合能力测试、性格问卷和英语口语测试。以下是各部分的具体内容&#xff1a; 1. **综合能力测试**&#xff1a; - 这部分测试需要46分钟完成&#xff0c;建议准备计算器和纸笔。 - 测试内容涉及问题解决能力、数值计算能力和逻辑推理能力。 -…

Docker-软件容器平台

一、容器 1、什么是容器 容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和 Windows…

K8s使用nfs

改动点 ip和路径改为自己的 --- apiVersion: v1 kind: ServiceAccount metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-client --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata:nam…

Spring Boot集成Access DB实现数据导入和解析

1.什么是Access DB&#xff1f; microsoft office access是由微软发布的关联式 数据库管理系统。它结合了 microsoft jet database engine 和 图形用户界面两项特点&#xff0c;是一种关系数据库工具。它在很多地方得到广泛使用&#xff0c;例如小型企业&#xff0c;大公司的部…

Linux命令--paste

简介 paste命令用于合并文件行 参数说明 -d: 自定义间隔符&#xff0c;默认为tab -s&#xff1a;串行处理&#xff0c;非并行 示例 将两个文件&#xff0c;按照行合并 demo1.conf内容如下&#xff1a; name domain ip area user password roledemo2.conf内容如下 test t…

Python批量合并多个PDF

安装pymupdf pip install pymupdf合并PDF文件 合并两个PDF 方法Document.insert_pdf()可以在不同的 PDF 文档之间复制页面。示例&#xff08;doc1和doc2是打开的 PDF&#xff09;&#xff1a; # append complete doc2 to the end of doc1 doc1.insert_pdf(doc2)import fitz…

WSL开发--利用Git连接远程仓库(详细步骤)

这篇文章主要介绍了如何将本地项目推送到 GitLab 上&#xff0c;并且避免每次提交都需要输入用户名和密码。文中分步讲解了配置 GitLab SSH 密钥以及配置 Git 远程仓库地址的方法。以下是文章的优化和简洁版&#xff1a; 将本地项目推送到 GitLab 并配置 SSH 免密登录 为了方便…

Hive中各种Join的实现

一. 数据准备 1. 创建两张表 create table tablea (id int, name string) row format delimited fields terminated by ,; create table tableb (id int, age int) row format delimited fields terminated by ,;2. 准备两份数据 tablea.txt文件数据如下&#xff1a; 1,hua…

快消零售行业企业员工培训的数字化转型

在快速消费品&#xff08;FMCG&#xff09;行业中&#xff0c;员工培训对于保持企业的竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;快消零售行业需要不断适应新的市场趋势。数字化转型为员工培训提供了新的机遇&#xff0c;尤其是在构建在线培训知识库方…