【Linux】守护进程

1 相关概念

1.1 守护进程的概念

守护进程也叫做精灵进,是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。

  • 守护进程是非常有用的进程,在Linux当中大多数服务器用的就是守护进程。比如,web服务器http等,同时守护进程完成很多系统的任务。当Linux系统启动的时候,会启动很多系统服务,这些进程服务是没有终端的,也就是你把终端关闭了,这些系统服务是不会停止的,它们一直运行着。它们有一个名字,就叫做守护进程。

一般以服务器的方式工作,对外提供服务的服务器,都是以守护进程(精灵进程的方式在服务器中工作的,一旦启动之后,除非用户主动关闭,否则,一直会在运行。)

1.2 进程组和会话

进程组的相关概念:

  • 进程除了有进程的PID之外,还有一个进程组,进程组是一个进程或者多个进程组成。通常他们与同一作业相关联,可以收到同一终端的信号;
  • 每个进程组有唯一的进程组ID,每一个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长?通常进程ID等于进程该进程组ID,那么该进程就是该进程组的组长。

会话组的相关概念:

  • 会话是有一个或者多个进程组组成的集合
  • 一个会话可以有一个终端,建立与控制终端连接的会话首进程被成为控制进程,一个会话的几个进程组可以分为前台进程和后台进程,而这些进程组的控制终端相同,也就是sesion id是一样的。当用户使用Ctrl + c 产生SIGINT信号时,内核会发送信号给相应的前台进程组的所有进程。
  • 如果运行一个程序,我想把它放到后台运行,可以在可执行程序后面加一个&;
  • 如果想把后台进程提到前台,可以使用fg
  • jobs指令可以查看当前会话的后台进程
  • 将前台进程放到后台,Ctrl + z  |  bg + 任务编号

观察现象:

 下面来介绍上述选项的意义:

 

 

 

 

 

 

综上:

  • 我们在命令行中启动一个进程,现在就可以叫做在会话中启动一个进程组,来完成某种任务;
  • 所有会话内的进程fork创建子进程,一般而言依旧属于当前会话。

像平时,当我们觉得Windows卡顿的时候,我们可能会重新注销一下。注销就是让用户退出登录后再重新登陆,那么此时就相当于给你新建一个会话。卡顿是因为你本次登陆过程中启动了很多任务,且都属于同一个会话,注销本质就是把你内部会话的所有进程组删掉。

注意:

  • 在登录的状态时,新起了一个网络服务器,创建好之后,在派生的子进程也属于当前会话,所以我们就不能让这个网络服务器属于这个会话内容,要不然它会受到用户的登录和注销的影响。
  • 所以,当我们有个网络服务的时候,应该脱离这个会话,让它独立的在计算机里自成进程组,自成新会话。这样在两个用户同时登录的时候,形成的两个会话是独立的,在操作各自的bash不会相互影响。
  • 像这种自成进程组,自成新会话,而且周而复始的进程称为守护进程(精灵进程)。

2 守护进程的方式

我们这里有三种方式让自己的进程守护进程化:

  • 自己写daemon函数,推荐使用这种方式
  • 用系统的daemon函数
  • nohup命令

2.1 TCP网络程序(守护进程化)

之前的TCP网络程序是在前台运行的,但是实际上服务器并不是在前台运行的,而是在后台运行的。所以现在对TCP网络程序的代买进行修改,加上一个小组件,使其守护进程化,让服务器在后台运行。编写daemon.hpp文件完成守护进程的主要逻辑,具体如下:

  1. 忽略一些不需要的异常信号,防止进程被信号杀死,如:调用signal函数忽略SIGPIPE信号;
  2. 更改进程的工作目录(选做);
  3. fork创建子进程,exit让父进程退出。让执行服务的进程不是进程组组长,从而保证后续不会再和其他终端相关联;
  4. 调用setsid函数设置自己是一个独立的会话(setsid不能设置进程组组长的进程);
  5. 将标准输入、标准输出、标准错误重定向到/dev/null(一种文件,不能写也不能读);

进程守护化需要调用setsid()函数,注意点如下:

  • 调用setsid创建新会话的目的,是让当前进程自成会话,与当前bash脱离关系(创建守护进程的核心)。
  • 调用setsid创建新会话时,要求调用进程不能是进程组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并执行后续代吗,而父进程直接exit退出即可。此时子进程就不是组长进程了,而是独立会话的守护进程。
  • 当服务端给客户端写入时,但是客户端突然关掉了,那就是向一个不存在的文件描述符写入,此时服务端会收到SIGPIPE信号而自动终止,所以我们要忽略该信号。
  • 当前进程有自己的工作目录,有时候守护进程想要更改自己的工作目录,一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。我们可以使用chdir函数更改进程的工作目录,不过此操作不做强求。
  • 守护进程不能直接和用户交互,也就是说守护进程与终端去关联了,因此一般我们会将守护进程的标准输入。标准输出、标准错误都重定向到/dev/null,/dev/null是一个字符文件(设备),类似于Linux的一个“文件黑洞”or“垃圾桶”,通常用于屏蔽/丢弃输入输出信息。(建议这么做)

daemon.hpp实现如下

#pragma once#include <cstdlib>
#include <cstring>
#include <signal.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include "log.hpp"
#include "err.hpp"//守护进程的本质:孤儿进程
void Daemon()
{// 1. 忽略异常信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 创建子进程,让子进程成为新的会话if (fork() > 0)exit(0); // 父进程退出// 子进程// 3. 设置子进程为新会话pid_t id = setsid();if (id < 0){logMessage(Fatal, "setsid error:%s\n", strerror(errno));exit(SETSID_ERR);}logMessage(Info, "setsid successful.\n");//4. 可选,更改工作目录//chdir("/");//5. 处理0,1,2的问题int fd=open("/dev/null",O_RDWR);if(fd<0){logMessage(Fatal,"open /dev/null error:%s\n",strerror(errno));exit(OPEN_ERR);}logMessage(Info,"open /dev/null successful!\n");dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);
}

出现问题:进程变成守护进程后,打印的日志信息不见了,要怎么办?

解决问题:日志持久化,将日志输出追加打印到log.txt文件中!


最后一个步骤:我们只需要在服务端的main函数命令行参数信息处理后调用此daemon函数即可:

 

 测试结果:

  • 现在我们运行服务端,通过下面的监控脚本辅助观察信息:
[xzy@ecs-333953 tcp]$ ps axj | head -1 && ps axj | grep serverTcp
[xzy@ecs-333953 tcp]$ ps axj | head -1 && ps axj | grep sshd

 

 2.2 TCP网络编程代码

lesson25/tcp · 杰编程/LinuxCode - 码云 - 开源中国 (gitee.com)

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

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

相关文章

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

【网络基础知识铺垫】

文章目录 1 :peach:计算机网络背景:peach:1.1 :apple:网络发展:apple: 2 :peach:协议:peach:2.1 :apple:协议分层:apple:2.2 :apple:OSI七层模型:apple:2.3 :apple:TCP/IP模型:apple:2.4 :apple:TCP/IP模型与操作系统的关系:apple: 3 :peach:网络传输基本流程:peach:4 :peach:网…

MybatisPlus存在 sql 注入漏洞(CVE-2023-25330)解决办法

首先我们了解下这个漏洞是什么&#xff1f; MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件&#xff0c;可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在…

DeviceNet主站网关转ETHERCAT连接ethercat总线伺服如何控制

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关——捷米JM-ECTM-DNT。这款产品可是解决了不同协议设备数据交换的麻烦问题&#xff0c;让我们一起来看看它的神奇之处吧&#xff01; 这款通讯网关有什么特别的呢&#xff1f;首先&#xff0c;它可以连接DEVICENET总…

火车头标题伪原创【php源码】

大家好&#xff0c;给大家分享一下python怎么读取文件中的数据&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; python是一门非常火爆且相对易学的编程语言&#xff0c;应用在各种场景。许多人想学…

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

文章目录 引入IPC通信[主/渲染]进程对应渲染进程>主进程代码测试测试效果 主进程>渲染进程代码测试测试效果 双向通信代码测试测试效果 引入 electron项目常常由一个主进程和多个渲染进程构成&#xff0c;渲染进程之间是隔离的&#xff0c;而所有渲染进程都和主进程共享…

vscode 格式问题

1、EditorConfig for VS Code 插件 shift alt f 格式化文件&#xff08;VS Code格式化按键&#xff09;&#xff0c;如下图&#xff0c;每个缩进4空格 代码如下 创建文件名 .editorconfig root true [*] charset utf-8 indent_style space indent_size 2 end_of_…

Docker 启动 Nacos 报错:No DataSource set

​ &#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 …

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

静态页面与动态页面的区别及部署jpress应用

简述静态网页和动态网页的区别 静态网页&#xff1a; 1、首先是静态网页&#xff0c;静态网页每个网页中都有一个固定的URL&#xff0c;网页URL以htm、HTML、jpg、.gif、.mp4等常见形式为后缀&#xff0c;而且不含有问号&#xff1b; 2、静态网页内容一经发布到网页服务器上…

Java 8:让你的代码更简洁、高效和灵活的新特性

Java 8 ——企业中使用最普遍的版本&#xff0c;那么了解它的新特性是非常有必要的 目录 一、函数式接口 二、Lamdba表达式 三、方法引用 四、Stream API 3.1 创建 方法一&#xff1a;通过集合 方法二&#xff1a;通过数组 方法三&#xff1a;通过Stream的of() 方法四…

《JeecgBoot系列》JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色

JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色 需求&#xff1a;将生产工厂是配件工厂的行改变颜色标注 一、修改table组件内容 在<a-table></a-table>内添加:rowClassName"tableRowClass" <a-table>...:rowClassName"t…

【Linux】从0到1实现一个进度条小程序

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处 文章目录 前言一、理解回车 \r 和换行 \n二、初步认识缓冲区1. 认识第一个函数&#xff1a;sleep2.观察缓冲区…

Hive终端命令行打印很多日志时,如何设置日志级别

示例&#xff1a;use test; 切换到test数据库时&#xff0c;输出很多日志信息不方便看结果&#xff0c;如下图。 解决方法&#xff1a; 退出hive命令行界面&#xff08;ctrlC&#xff09;执行“vi /usr/local/apache-hive-3.1.2-bin/conf/log4j.properties”命令&#xff0c;创…

Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting

安装PlatformIO插件成功&#xff0c;初始化失败 错误信息判断问题尝试访问https://pypi.tuna.tsinghua.edu.cn/simple/platformio/成功点击文件后报错如下&#xff1a; 解决问题- 换源 &#xff08; Windows下有两个地方需要更改&#xff09;cmd命令行Pip文件 总结&#xff1a;…

Python自动化测试之用Robot Framework进行自动化测试详解

概要 你还在手动测试&#xff1f;不妨了解一下更高效、准确且简单的测试方法——使用Python的Robot Framework进行自动化测试。 什么是Robot Framework&#xff1f; Robot Framework是一款开源的Python自动化测试框架&#xff0c;它基于关键字驱动的思想&#xff0c;具有易读、…

Autoware.ai1.14.0自动驾驶-Demo运行

Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据&#xff1a; wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…

比较 Java Enterprise Architecture 中的 MongoDB 和 Couchbase

​MongoDB和Couchbase是两种常用的NoSQL数据库&#xff0c;用于在Java实现的企业架构中存储和管理数据。以下是它们之间的主要差异、比较和权衡。 在当今快速发展的企业架构领域&#xff0c;MongoDB和Couchbase已经成为NoSQL数据库中两个重要的竞争者。本文全面探讨了这两个强…

【链表OJ 1】移除链表元素val

大家好&#xff0c;欢迎来到我的博客&#xff0c;此题是关于链表oj的第一题&#xff0c;此后还会陆续更新博客&#xff0c;如有错误&#xff0c;欢迎大家指正。 来源:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目: 方法一:定义prev和cur指针…