【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;中国首个在海外建设独立校园的大学…

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;并独立于其它线程运行。 鸿蒙内核每个…

细致讲解——不同类型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 注解。后续的版本更新中会逐渐替换成函数式…

【Kotlin】Channel简介

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

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

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

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

在上篇博客&#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…

《架构风清扬-Java面试系列第25讲》聊聊ArrayBlockingQueue的特点及使用场景

ArrayBlockingQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题&#xff0c;老规矩&#xff0c;我们将从使用场景和代码示例来进行讲解 来&#xff0c;思考片刻&#xff0c;给出你的答案 1&#xff0c;使用场景 实现&#xff1a;基于数组实现的有界阻塞队列&…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频 - Circle 阅读助手

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

mysql UNION 联合查询

mysql UNION 联合查询 业务需要拉数据&#xff0c;这里需要对查询不同格式的数据进行组装&#xff0c;此处采用联合查询 注意1&#xff1a;null as 设备关爱 &#xff0c;结果为null&#xff0c;表头为设备关爱 注意2&#xff1a; UNION 或者 UNION ALL 联合查询自行选用 注意3…

如何避免被恶意攻击的IP地址

随着互联网的普及和发展&#xff0c;网络安全问题日益受到关注&#xff0c;恶意攻击成为网络安全的一大威胁。而IP地址作为网络通信的基础&#xff0c;常常成为恶意攻击的目标之一。本文将探讨如何避免被恶意攻击的IP地址&#xff0c;提高网络安全水平。 1. 定期更新安全补丁 …

【kettle003】kettle访问SQL Server数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下Microsoft SQL Server 2022关系数据库相关知识体系 kettle访问SQL Server数…

ITMS-90426: Invalid Swift Support

原文 Please correct the following issues and upload a new binary to App Store Connect. ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. 解决方式 ITMS-…