【Linux进程】守护进程

news2025/1/16 1:44:04

【Linux进程】守护进程

目录

  • 【Linux进程】守护进程
    • 守护进程
      • 守护进程概念
      • 进程组和会话的概念
    • 系统的守护进程函数

作者:爱写代码的刚子

时间:2024.4.27

前言:本篇博客将会介绍守护进程,以及进程组和会话的概念,如何变成守护进程等知识

守护进程

守护进程概念

守护进程也叫做精灵进程,是运行在后台的一种特殊进程他独立于控制终端并且可以周期性的执行某种任务或者等待处理某些发生的事件。守护进程是非常有用的进程,在Linux当中大多数服务器用的就是守护进程比如Web服务器httpd等,同时守护进程完成很多系统的任务。当Linux系统启动的时候,会启动很多系统服务,这些进程服务是没有终端的也就是说你把终端关闭了这些系统服务是不会停止的,他们一直运行着他们有一个名字就叫做守护进程。一般以服务器的方式工作,对外提供服务的服务器,都是以守护进程(精灵进程)的方式在服务器中工作的,一旦启动之后,除非用户主动关闭,否则,一直会在运行。

进程组和会话的概念

  • 进程组的相关概念:

    • 进程除了有进程的PID之外还有一个进程组,进程组是由一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号

    • 每个进程组有唯一的进程组ID,每个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长了,通常进程组ID等于进程ID那么这个进程就是对应进程组的组长。

  • 会话的相关概念:

    • 会话是有一个或者多个进程组组成的集合
    • 一个会话可以有一个终端,建立与控制终端连接的会话首进程被成为控制进程,一个会话的几个进程组可以分为前台进程和后台进程,而这些进程组的控制终端相同也就是sesion id是一样的当用户使用ctr +c 产生SIGINT信号时内核会发送信号给相应前台进程组的所有进程如果我运行一个程序我们想要把他放到后台运行我们可以在可执行程序的后面加一个& 举个列子:./test & 如果我们想要把他提到前台进程我们可以使用fg

无论是前台进程还是后台进程,都可以向显示器打印,一个session只能有一个前台进程运行,键盘信号只能发给前台进程(谁拥有键盘文件,谁就是前台进程)

  • jobs查看后台进程

  • fg +任务号将后台任务提到前台

  • ctrl + z将前台进程暂停并放到后台

  • bg +任务号将暂停的后台进程重新启动

在这里插入图片描述

在这里插入图片描述

进程与进程之间不仅有进程独立性的关系,还有进程组的关系

  • 上述我创建了三个进程,可以确定的是这三个进程的PPID都是一样的,因为父进程都是Bash。上述三个进程是属于同一个进程组(PGID)的,且会发现启动的第一个进程是进程组的组长
  • **ps axj | head -1 && ps axj | grep -E ‘-bash$’**查看bash进程

在这里插入图片描述

bash是独立成进程组独立成会话的一个进程

  • while :;do ps ajx | head -1 && ps ajx | grep -E ‘-bash$’;sleep 1;done进行循环打印测试

在这里插入图片描述

我们新打开了一个会话,发现bash进程变多了

  • 我们创建四个后台进程:

在这里插入图片描述

  • 查看当前process进程:

在这里插入图片描述

  • 关闭bash重新登陆bash后查看process进程:

在这里插入图片描述

从上面我们可以看到纯后台进程是会收到用户登陆和退出的影响的

不想受到任何用户登陆和注销的影响就要——守护进程化

我们将自成进程组、自成会话的进程叫做守护进程,与bash变成并列关系而不是包含关系

  • setsid()函数创建一个session并将调用该函数进程的组ID变成会话的ID

在这里插入图片描述

注意,要调用这个函数,调用的进程不能是进程组的组长

【问题】:如何保证自己不是组长?

调用fork()函数,让父进程退出,子进程调用setsid()

if(fork() > 0) exit(0);setsid()

所以守护进程的本质也是孤儿进程

Daemon.hpp

#pragma once

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
const std::string nullfile = "/dev/null";

//进来的是父进程,出去的是子进程
void Daemon(const std::string &cwd = "")
{
    //1. 忽略其他异常信号
    signal(SIGCLD,SIG_IGN);//父进程不需要调用wait进行回收子进程
    signal(SIGPIPE,SIG_IGN);
    signal(SIGSTOP,SIG_IGN);

    //2. 将自己变成独立的会话
    if(fork() >0) exit(0);
    setsid();

    //3. 更改调用进程的工作目录
    if(!cwd.empty())
    {
        chdir(cwd.c_str());
    }
  
  	//Daemon函数可以运用到服务器Start()函数的开头,将该进程变成守护进程,但是我们可能会想到,服务器中会存在大量的打印,往标准输出打
  	//4. 关闭/? 标准输入,标准输出,标准错误
 		// 标准输入,标准输出,标准错误重定向至/dev/null(字符文件,相当于垃圾桶)
    int fd = open(nullfile.c_str(), O_RDWR);
    if(fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}
  • dup2函数

在这里插入图片描述

  • 将Daemon函数添加到Tcp服务器中,守护进程化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第一行 -D 结尾的就是服务器(守护进程)。它的PPID是1。下面来介绍上述选项的意义:
COMMAND:启动的进程命令名称
TIME:进程启动的时长
UID:是谁启动的
STAT:状态
TPGID:当前进程组和终端的关系(如果是-1,则没有任何关系)
TTY:代表哪一个终端
SID:当前进程的会话ID
PGID:当前进程所属的进程组
PID:当前进程自己的ID
PPID:当前进程的父进程的ID

  • 查看重定向信息

在这里插入图片描述

  • 切换守护进程的目录

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 【问题】:为什么我们能远程登陆服务器?(存在sshd守护进程)

在这里插入图片描述

在这里插入图片描述

所以守护进程一般以d结尾,一般把日志信息存放到文件中

在这里插入图片描述

在这里插入图片描述

于是便有了日志信息

  • 要特别注意,如果变成了守护进程并改变了路径,log目录的位置也一定要改变!!!

系统的守护进程函数

在这里插入图片描述

在这里插入图片描述

  • 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
  • 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,否则不做处理。

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

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

相关文章

我教你如何可翻页电子画册

​电子画册是一种创新的方式&#xff0c;可以将传统的纸质画册转化为数字化的形式&#xff0c;并且具备翻页的功能。它不仅可以提供更好的阅读体验&#xff0c;还可以方便地分享给他人。 1.选择制作工具&#xff1a; 有许多在线平台和软件可以帮助你制作电子画册&#xff0c;比…

Qt6找不到Bluetooth蓝牙组件

图文解释来了&#xff01;调试了一下午。 错误如图&#xff1a; Failed to find required Qt component "Bluetooth" 解决方法&#xff1a; 找到安装QT安装包下的MaintenanceTool.exe&#xff0c;双击打开 打开后&#xff0c;找到这个Qt Connectivity&#xff0c;…

ChatGPT有记忆了?!持久记忆(Memory)功能详细解读和教程!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【个人博客搭建】(11)swagger添加jwt信息

这个主要是为了方便使用swagger时&#xff0c;能更好的带入我们的token。 ps&#xff1a;如果使用其他第三方api工具&#xff08;apipost、postman等&#xff09;则不需要。 &#xff08;当然&#xff0c;不用不能没有&#xff0c;是吧&#xff09; 1、在AddSwaggerGen内添加…

阿里开源截止目前为止参数规模最大的Qwen1.5-110B模型:MMLU评测接近Llama-3-70B,略超Mixtral-8×22B!

本文原文来自DataLearnerAI官方网站&#xff1a;阿里开源截止目前为止参数规模最大的Qwen1.5-110B模型&#xff1a;MMLU评测接近Llama-3-70B&#xff0c;略超Mixtral-822B&#xff01; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051714140775766 Qw…

Android使用AlertDialog实现弹出菜单

最近又开始捣鼓APP&#xff0c;许多api , class都忘记怎么用了&#xff0c;楼下使用AlertDialog实现个弹出菜单&#xff0c;结果直接crash&#xff0c;查了半天&#xff0c;终于即将&#xff0c;记录一下…… 1 实现代码 AlertDialog.Builder mBuilder new AlertDialog.Builde…

纯血鸿蒙APP实战开发——主页瀑布流实现

介绍 本示例介绍使用ArkUIWaterFlow组件和LazyForEach实现瀑布流场景。该场景多用于购物、资讯类应用。 效果图预览 使用说明 加载完成后显示整个列表&#xff0c;超过一屏时可以上下滑动。 实现思路 创建WaterFlowDataSource类&#xff0c;实现IDataSource接口的对象&…

SpringBoot 常用注解总结超详细(面试)

目录 一、组件相关&#x1f381; Controller Service Repository Component 二、依赖注入相关&#x1f349; Autowired Resource 根据类型注入&#xff08;By Type&#xff09; 根据名称注入&#xff08;By Name&#xff09; 区别 Qualifier Resource 和 Qualifie…

通用视觉多模态大模型 一统理解/生成/分割/编辑

这是一款通用视觉多模态大模型&#xff0c;支持从视觉理解到视觉生成、从低层次到高层次的一系列视觉任务&#xff0c;解决了困扰大语言模型产业已久的图像/视频模型割裂问题&#xff0c;提供了一个全面统一静态图像与动态视频内容的理解、生成、分割、编辑等任务的像素级通用视…

如何在Windows 11中安装或删除可选功能?这里提供详细步骤

序言 Windows 11提供了各种各样的功能,其中许多功能,如Linux的Windows子系统(WSL)和语言包,它默认情况下不会安装。你也可以删除默认情况下安装的功能,以下是如何以图形方式或从命令行执行此操作。 关于Windows 11中的可选功能,你需要了解的内容 还有其他添加和删除功…

UVa12313 A Tiny Raytracer

UVa12313 A Tiny Raytracer 题目链接题意分析AC 代码 题目链接 UVA - 12313 A Tiny Raytracer 题意 给出 《训练指南》题意翻译 本题的任务是实现一个小型光线追踪渲染器。场景由若干三角形网格&#xff08;triangle mesh&#xff09;组成&#xff0c;有且仅有一个点光源&…

基于Vue3实现的 宫格 图片摆放

一个可以支持无限宫格的 vue3实现 本来要参考微信群头像的规则实现&#xff0c;网上找到一大堆类似的需求&#xff0c;奈何XXX折磨人&#xff0c;九宫格已经不能满足ta了。 当前代码实现了………… 好多东西(可以多宫格).具体的看效果图 code <style scoped langless> .…

【Chapter1】绪论,《微机系统》第一版,赵宏伟

一、绪论 1.1 微处理器、微型计算机和微型计算机系统 计算机按照体积、性能、价格通常分为巨型机、大型机、中型机、小型机和微型计算机&#xff08;简称微机&#xff0c;如单片机、单板机&#xff09;五类。但是它们都由五大部分组成&#xff1a;运算器、控制器、存储器、输…

Golang | Leetcode Golang题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; func totalNQueens(n int) (ans int) {columns : make([]bool, n) // 列上是否有皇后diagonals1 : make([]bool, 2*n-1) // 左上到右下是否有皇后diagonals2 : make([]bool, 2*n-1) // 右上到左下是否有皇后var backtrack func(int)…

iZotope RX 10 音频修复和增强工具 mac/win

iZotope RX 10 for Mac是一款出色的音频修复和增强工具&#xff0c;凭借其卓越的音频处理技术&#xff0c;能够轻松应对各种音频问题。 无论是背景噪音、回声还是失真&#xff0c;RX 10都能精准去除&#xff0c;还原清晰纯净的音频。同时&#xff0c;它还提供了丰富的增强工具&…

前端HTML5学习1(新增布局,状态,列表,文本,表单控件标签)

前端HTML5学习1&#xff08;新增布局&#xff0c;状态&#xff0c;列表&#xff0c;文本&#xff0c;表单控件标签&#xff09; 新增布局标签新增状态标签新增列表标签新增文本标签新增表单控件属性input新增属性值 新增布局标签 HTML5 引入了许多新的语义化标签&#xff0c;用…

Vue2基础知识:组件的样式冲突scoped,为什么加了scoped样式就会独立出来呢?

默认情况&#xff1a;写在组件中的样式会全局生效&#xff0c;这样就容易造成多个组件之间的样式冲突问题。 1.全局样式&#xff1a;默认组件中的样式会作用到全局.&#xff08;也就是说不管你在哪个页面或者组件中写入样式&#xff0c;只要页面生效&#xff0c;该页面的style…

【利兹】XJCO3221 Parallel Computation 并行计算考试资料辅导

XJCO3221 (34964) 西交利兹院 【并行计算】 Parallel Computation 资料or辅导 需要请私聊 1.独家近年考试题 包你高分 2.cw&#xff1a; Coursework 1: OpenMP Programming Assignment Coursework 2: MPI Programming Assignment and Analysis Coursework 3: OpenCL Progr…

STM32与Proteus的串口仿真详细教程与源程序

资料下载地址&#xff1a;STM32与Proteus的串口仿真详细教程与源程序 资料内容 包含LCD1602显示&#xff0c;串口发送接收&#xff0c;完美实现。 文档内容齐全&#xff0c;包含使用说明&#xff0c;相关驱动等。 解决了STM32的Proteus串口收发问题。 注意&#xff1a;每输…

笔试狂刷--Day7(搜索,动态规划)

大家好,我是LvZi,今天带来笔试狂刷--Day7 一.Fibonacci数列 1.题目链接 链接:Fibonacci数列 2.分析 在求解fib数列的过程中判断什么时候接近最小值 3.代码 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public sta…