【Linux进程】守护进程

【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.mzph.cn/bicheng/4251.shtml

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

相关文章

《C++学习笔记---入门篇3》---内联函数,auto关键字,范围for,指针空值nullptr

1.内联函数 1.1 内联函数概念 1.2 特性 1.3 接下来说一道面试题&#xff1a; 2.auto关键字(C11) 2.1auto简介 2.2 auto的使用细则 3.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1范围for的语法 3.2 范围for的使用条件 4.指针空值---nullptr(C11) 4.1 C98中的…

25计算机考研院校数据分析 | 厦门大学

厦门大学&#xff0c;简称厦大&#xff08;XMU&#xff09;&#xff0c;地处福建厦门。由著名爱国华侨领袖陈嘉庚先生于1921年创办&#xff0c;是中国近代教育史上第一所华侨创办的大学&#xff0c;是国内最早招收研究生的大学之一&#xff0c;中国首个在海外建设独立校园的大学…

IP模块——计算机网络

IP模块在计算机网络中通常指的是处理互联网协议&#xff08;Internet Protocol&#xff0c;简称IP&#xff09;的部分&#xff0c;它负责网络中的数据包的发送和接收。IP是一种无连接的协议&#xff0c;意味着它不需要建立持久的连接才能在网络中传输数据。IP模块的主要任务包括…

填充公共命名空间的例子

公共命名空间简述 制作计算机语言分两步走&#xff1a;填充公共命名空间、研究新编译原理。其中&#xff0c;公共命名空间用于确定语言是什么样子的&#xff0c;新编译原理用于实现语言。 简单来说&#xff0c;公共命名空间包括所有方言的所有句子。C语言、Java语言是方言&am…

C++ 动态链接库DLL创建及使用

一、动态链接库DLL创建 使用VS2022 创建 1、创建新解决方案 创建即可 2、创建动态链接库新项目 右键解决方案 语言选择C&#xff0c;选择动态链接库 填入项目名称&#xff0c;勾选&#xff1a;将解决方案和项目放在同一目录中 点击创建 3、创建后&#xff0c;显示dllmai…

详解centos8 搭建使用Tor 创建匿名服务和匿名网站(.onion)

1 Tor运行原理&#xff1a; 请求方需要使用&#xff1a;洋葱浏览器&#xff08;Tor Browser&#xff09;或者Google浏览器来对暗&#xff0c;网网站进行访问 响应放需要使用&#xff1a;Tor协议的的Hidden_service 2 好戏来了 搭建步骤&#xff1a; 1.更新yum源 rpm -Uvh h…

鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元

任务即线程 在鸿蒙内核中&#xff0c;广义上可理解为一个任务就是一个线程 官方是怎么描述线程的 基本概念 从系统的角度看&#xff0c;线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它线程运行。 鸿蒙内核每个…

python绘制热点图

在Python中&#xff0c;我们通常使用seaborn或matplotlib库来绘制热点图&#xff08;也称为热图&#xff0c;Heatmap&#xff09;。下面是一个使用seaborn库来绘制热点图的简单示例&#xff1a; 首先&#xff0c;确保你已经安装了seaborn和matplotlib库。如果没有&#xff0c;…

细致讲解——不同类型LSA是作用以及相互之间的联系

目录 一.常见的LSA类型 二.OSPF特殊区域 1.区域类型 2.stub区域和totally stub区域 &#xff08;1&#xff09;stub区域 &#xff08;2&#xff09;totally stub区域 3.nssa区域和totally nssa区域 &#xff08;1&#xff09;nssa区域 &#xff08;2&#xff09;totall…

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

SpringCloudStream 3.x rabbit 使用

1. 前言 今天带来的是SpringCloudStream 3.x 的新玩法&#xff0c;通过四大函数式接口的方式进行数据的发送和监听。本文将通过 rabbitMQ 的方式进行演示 3.x版本后是 可以看到 StreamListener 和 EnableBinding 都打上了Deprecated 注解。后续的版本更新中会逐渐替换成函数式…

2024年第十七届 认证杯 网络挑战赛 (B题)| 神经外科手术的定位与导航 | 有限元方法 泊松分布 |数学建模完整代码+建模过程全解全析

人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要将颅骨打开一个(或几个)圆形窗口,将病变部位暴露在术野中。但当病变部位较深时,就必须将上方的脑组织进行一定程度的…

【Kotlin】Channel简介

1 前言 Channel 是一个并发安全的阻塞队列&#xff0c;可以通过 send 函数往队列中塞入数据&#xff0c;通过 receive 函数从队列中取出数据。 当队列被塞满时&#xff0c;send 函数将被挂起&#xff0c;直到队列有空闲缓存&#xff1b;当队列空闲时&#xff0c;receive 函数将…

电脑的无用设置功能(建议关闭)

目录 1、传递优化 ​2、常规​ 3、电源 1、传递优化 2、常规3、电源

UNIXUNIX

RTC的核心部分如图所示&#xff0c;最左边是RTCCLK时钟来源&#xff0c;需要在RCC里边配置&#xff0c;3个时钟选择一个当做RTCCLK&#xff0c;之后先通过预分频器对时钟进行分频&#xff1b;余数寄存器是一个自减计数器&#xff0c;存储当前的计数值&#xff0c;重装计数器是计…

数据结构七:线性表之链式栈的设计

在上篇博客&#xff0c;学习了用数组实现链的顺序存储结构&#xff0c;那是否存在用单链表实现栈的链式存储结构&#xff0c;答案是当然的&#xff0c;相比于顺序栈&#xff0c;用数组实现的栈效率很高&#xff0c;但若同时使用多个栈&#xff0c;顺序栈将浪费很多空间。用单链…

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时&#xff0c;攻击者可以通过lang参数和目录穿越实现文件包含&#xff0c;当存在其他扩展模块如 pear 扩展时&#xff0c;攻击者可…

高级IO|从封装epoll服务器到实现Reactor服务器|Part1

从封装epoll_server到实现reactor服务器(part1) 项目复习&#xff1a;从封装epoll_server到实现reactor服务器(part1)EPOLL模式服务器初步 select, poll, epoll的优缺点epoll的几个细节封装epoll_server基本框架先写好创建监听套接字和创建epoll模型可以Accept了吗&#xff1f…

使用rust学习基本算法(四)

使用rust学习基本算法&#xff08;四&#xff09; 二叉堆 二叉堆是一种特殊的完全二叉树&#xff0c;它可以分为最大堆和最小堆。在最大堆中&#xff0c;每个节点的值都大于或等于其子节点的值&#xff1b;而在最小堆中&#xff0c;每个节点的值都小于或等于其子节点的值。这种…