守护进程Daemon
进程组、对话期和控制终端关系
- 每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组。
- 产生在控制终端上的输入(Input)和信号(Signal)将发送给会话的前台进程组中的所有进程。对于输出(Output)来说,则是在前台和后台共享的,即前台和后台的打印输出都会显示在屏幕上。
- 终端上的连接断开时 (比如网络断开或 Modem 断开),挂起信号将发送到控制进程(controlling process) 。
- 一个用户登录后创建一个会话。一个会话中只存在一个前台进程组,但可以存在多个后台进程组。
- 第一次登陆后第一个创建的进程是shell,也就是会话的领头进程,该领头进程缺省处于一个前台进程组中并打开一个控制终端可以进行数据的读写。【当在shell里运行一行命令后(不带&)创建一个新的进程组,命令行中如果有多个命令会创建多个进程,这些进程都处于该新建进程组中,shell将该新建的进程组设置为前台进程组并将自己暂时设置为后台进程组。比如
sleep 1 | sleep 2 | sleep 3】
进程ID
任何用XShell登陆,只允许一个前台进程和多个后台进程。【即在命令行运行其他进程后,就没法再让bash再对指令作出响应,说明bash被切换为后台进程】
进程除了有PID、PPID,还有组ID PGID,会话ID SID,终端进程组IDTPGID。
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ sleep 10000 | sleep 20000 | sleep 30000
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps ajx | head -1 && ps ajx | grep sleepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
12145 1089 12145 12145 ? -1 S 1001 0:00 sleep 180
15703 1782 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 10000
15703 1783 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 20000
15703 1784 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 30000
12598 1895 1894 12598 pts/5 1894 S+ 1001 0:00 grep --color=auto sleep
11424 11757 11424 1227 ? -1 Sl 0 1:11 /bin/sh -c sleep 100
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps ajx | head -1 && ps ajx | grep 15703PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
15703 1782 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 10000
15703 1783 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 20000
15703 1784 1782 15703 pts/6 1782 S+ 1001 0:00 sleep 30000
12598 1995 1994 12598 pts/5 1994 R+ 1001 0:00 grep --color=auto 15703
12247 15703 15703 15703 pts/6 1782 Ss 1001 0:00 /bin/bash --init-file /home/yyq/.vscode-server/bin/7f329fe6c66b0f86ae1574c2911b681ad5a45d63/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh
在命令行中,同时结合管道启动多个进程 sleep 1 | sleep 2 | sleep 3,这3个进程(sleep 10000、sleep 20000、sleep 30000)父进程都是bash,所以它们三是兄弟关系,可以用匿名管道进行通信。
组ID PGID
同时被创建的多个进程是一个组的,第一个被创建的进程是组长进程。(sleep 10000、sleep 20000、sleep 30000是一个进程组的,组ID是1782,组长是sleep 10000)
进程组是一个或多个进程的集合,他们与同一作业相关联。每一个进程组都有唯一的进程组ID PGID,PGID 能够在用户层改动,使用setpgid()函数可以改变当前进程的 PGID。通过fork()函数产生的子进程会继承它的父进程的进程组ID。
每一个进程组都有一个组长进程,组长进程的PGID等于其PID,组长进程能够先退出。
在某个进程组中只要有一个进程存在,则该进程组就存在,与其组长进程是否存在无关。进程组的最后进程能够退出或转移到其它进程组。
bash自成一组。
进程组的生命周期:组中最后一个进程终止或其加入其他进程组(离开本进程组)为止。
终端进程组ID(TPGID),用来标识一个进程是否处于一个和终端相关的进程组中。前台进程组中的进程的TPGID=PGID,后台进程组的PGID≠TPGID。若该进程和任何终端无关,其值为TPGID=-1。
前台进程组
该进程组中的进程能够向终端设备进行读、写操作的进程组。例如登陆shell(例如bash)通过调用int tcsetpgrp(int fd, pid_t pgrp); 函数设置为某个进程组pgrp关联终端设备fd,该函数执行成功后,该进程组pgrp成为前台进程组。
前台进程组中的进程的TPGID=PGID,后台进程组的PGID≠TPGID。
后台进程组
后台进程组中的进程只能够向终端设备写。
会话session
会话是一个或多个进程组的集合。系统函数getsid()用来获取某个进程的会话IDSID。
会话首进程是创建该会话的进程。
一般一个用户登录后新建一个会话,每个会话也有一个ID来标识(SID)。登录后的第一个进程叫做会话领头进程(session leader),通常是一个shell/bash。对于会话领头进程,其PID=SID。
任何一个控制终端,需要有多个进程/进程组来为用户提供服务(例如bash),当然用户自己也可以启动进程/进程组。这些给用户提供服务的进程/进程组又有一个会话的机制。
每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组。
控制终端controlling terminal
从终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端。
- 一个会话对应一个控制终端,建立于控制终端相连接的会话首进程被称为控制进程;
- 一个会话中的几个进程组可被分为一个前台进程组和几个后台进程组,假设一个会话有一个控制终端,则他有一个前台进程组;
- 不管何时键入终端的中断键,都会将中断信ID发送给前台进程组的全部会话;
- 不管何时键入终端的退出键,都会将退出信ID发送给前台进程组的全部会话。
一个会话一般会拥有一个控制终端用于执行IO操作。会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端。与控制终端建立连接的会话领头进程也称为控制进程 (controlling process) 。
一个会话只能有一个控制终端。

守护进程Daemon
守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程,大多数服务都是用守护进程实现的。比如:像我们的tftp,samba,nfs等相关服务。
是指自成一个会话,调用系统函数setsid(前提是当前进程不是进程组组长),与终端相连的。
守护进程本质是孤儿进程的一种,但是孤儿进程仍属于某个会话,而守护进程自成一个会话。
生命周期随系统
守护进程会长时间运行,常常在系统启动时就开始运行,直到系统关闭时才终止。
守护进程不依赖于终端!!
当控制终端被关闭时,相应的进程都会被自动关闭。【比如咱们平常写了一个死循环程序,咱们不知道有ctrl+c的时候,应该如何关闭该进程?关闭终端窗口!】
这也就意味着关闭终端的同时也关闭了我们的程序。
但是对于守护进程来说,其生命周期守护需要突破这种限制,它从开始运行,直到整个系统关闭才会退出,所以守护进程不能依赖于终端。
创建流程
- 忽略信号 SIGPIPE SIGCHLD
- 保证自己不是组长:创建子进程,父进程直接退出;
- 在子进程中创建新会话;
- 打开
/dev/null; - 通过
dup2对标准输入/输出/错误的重定向; - 关闭文件描述符
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ./Calserver 8080
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ ps -ajx | head -1 && ps -ajx | grep 8080PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND1 18544 18544 18544 ? -1 Ss 1001 0:00 ./Calserver 8080
从执行结果来看,我们可以看到1、该守护进程是以超级用户启动的(UID为0);2、没有控制终端(TTY为?);3、终端进程组ID为-1(该进程未和任何终端相关);4、守护进程的父进程为1516,即systemd(所有的守护进程的父进程)。
注意:
/dev/null,该路径写入的数据会被自动丢弃;- 因为子进程是没有和任何终端相关的,所以不可以用标准输入/输出/错误,否则会导致进程卡住。
setsid函数
头文件#include <unistd.h>
功能//首先内核会创建一个新的会话,并让该进程成为该会话的leader进程//同时伴随该session的建立,一个新的进程组也会被创建,同时该进程成为该进程组的组长//该进程此时还没有和任何控制终端关联。若需要则要另外调用tcsetpgrp//通过setsid可以让进程摆脱原会话的控制,摆脱原进程组的控制,摆脱原控制终端的控制
原型pid_t setsid(void);
在第二步我们调用了fork()函数来创建子进程再令父进程退出。由于在调用fork()函数时,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了,但原先的会话期、进程组和控制终端等并没有改变,因此,还不是真正意义上的独立。而setsid()函数能够使当前子进程完全独立出来,从而脱离所有其他进程和终端的控制。
dup2函数
头文件#include <unistd.h>
功能重定向文件描述符
原型int dup2(int oldfd, int newfd);
代码
#pragma once#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>void MyDaemon()
{// 1.忽略信号 SIGPIPE SIGCHLDsignal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);// 2.保证自己不是组长// 2.1 父进程直接退出if (fork() > 0)exit(0);// 3. 在子进程中调用setsid,创建新会话setsid();// 4.打开文件黑洞int devnull = open("/dev/null", O_RDONLY | O_WRONLY);// 5.标准输入/输出/错误的重定向if(devnull > 0){//对cin做重定向dup2(0, devnull);//对cout做重定向dup2(1, devnull);//对cerr做重定向dup2(2, devnull);}// 6.关闭文件描述符close(devnull);
}
关掉守护进程
netstat -ano 可以查看所有通信进程
// 找到被占用的指定端口号所对应的进程信息并呈现
sudo lsof -i:端口号
[yyq@VM-8-13-centos 2023_04_22_Calculator_TCPSocket]$ sudo lsof -i:8080
[sudo] password for yyq:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Calserver 13323 yyq 3u IPv4 279245559 0t0 TCP *:webcache (LISTEN)// 关掉守护进程
sudo kill pid
相关文章:
守护进程Daemon
进程组、对话期和控制终端关系 每个会话有且只有一个前台进程组,但会有0个或者多个后台进程组。产生在控制终端上的输入(Input)和信号(Signal)将发送给会话的前台进程组中的所有进程。对于输出(Output&…...
学生成绩管理系统 002
学生成绩管理系统 *****************学生成绩管理系统***************** 1、成绩添加 2、成绩输出 3、成绩查询 4、成绩统计 5、成绩排名 6、成绩删除 7、成绩修改 8、成绩按学号排序 0、退出系统 ************************************************** 请选择功能:1 **********…...
换个花样玩C++(4)细聊C++的引用精妙之处
引用是C++引入的新语言特性。而且在日常工作开发过程中,经常会使用到引用,对于一些做系统架构的架构师而言,这也是不可或缺的一门基本功,我在工作中发现,很多人并没有搞清楚引用。因此我在本篇中将对引用进行详细讨论,希望对大家更好地理解和使用引用起到抛砖引玉的作用。…...
Linux安装helm
前言 运行环境:CentOS7.9 官方参考文档:官方文档 文章末尾附有一键安装脚本 下载安装包 github下载对应版本的安装包,下载地址 进入对应版本的下载页面,这里以v3.11.3为例 选择对应系统的安装包,这里以linux为例 …...
ATTCK v12版本战术介绍——防御规避(四)
一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术,本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术,后续会介绍防御规避其他子技术…...
Orangepi Zero2 全志H616(DHT11温湿度检测)
最近在学习Linux应用和安卓开发过程中,打算把Linux实现的温湿度显示安卓app上,于是在此之前先基于Orangepi Zero2 全志H616下的wiringPi库对DHT11进行开发,本文主要记录开发过程的一些问题和细节,主要简单通过开启线程来接收温湿度…...
abbyy是什么软件
ABBYY,一款强大的OCR文字识别软件! 在日常的工作中,我们常常需要提取PDF或图片上的大段文字,如果字数少的话,我们可以直接手打,但如果出现大篇幅的文字,那就有点头疼了。今天,我就向…...
软件测试技术(四)白盒测试
白盒测试 白盒测试(White Box Testing)又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程,而不测试软件产品的功能,用于纠正软件系统在描述、表示和规格上的错误,…...
Java基础语法(十二):try-catch块
目录 前言 一、try-catch是什么? 二、其他异常处理机制 总结 前言 Java 异常处理机制是 Java 程序设计中至关重要的一部分。它允许程序员像处理普通数据一样处理异常,并根据异常类型采取合适的措施。其中一个非常基本的异常处理机制是 try-catch 块…...
尚融宝25-投资列表展示以及实现充值功能
目录 一、展示投资列表 (一)需求 (二)后端 (三)前端 二、充值功能 (一)需求 1、需求描述 2、流程 (二)充值 1、后端 2、前端 (三&…...
QML基础模型(Basic Model)
最基本的分离数据与显示的方法是使用Repeater元素。它被用于实例化一组元素项,并且很容易与一个用于填充用户界面的定位器相结合。 最基本的实现举例,repeater元素用于实现子元素的标号。每个子元素都拥有一个可以访问的属性index,用于区分不…...
如果ChatGPT写作论文,保姆及教程以及问题答疑
上次发表“如何用ChatGPT完成论文”后,许多捧场看官评论讨论,也有不少同学实操成功,但更多人寻求帮助。所以今天再整理一篇,把大家的疑问进行说明。 1. ChatGPT写的论文能否被检查出? 有同学反映将一段ChatGPT…...
机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...
vulnhub靶场之bluemoon
1.信息收集 存活主机进行探测,发现主机192.168.239.176存活。 对主机192.168.239.176进行端口扫描,发现21、22、80端口 访问http://192.168.239.176,并查看源码未发现可利用的行为。 进行目录扫描发现可疑路径/hidden_text 浏览器访问h…...
VTK 几何体连通区域分析 vtkPolyDataConnectivityFilter
前言: vtkPolyDataConnectivityFilter 使用过,但网上没有看到完事的教程;这里整理一下; 提取数据集中连通的多边形数据。 该类是一个滤波器,提取cell(区域) - 拥有公共点或者满足某个阈值 该类…...
scss、css样式中使用变量的方法;Vue动态改变css等样式文件中的变量
目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.遇到一些样式 设置的值都是重复的不想重复写,想和js一样定义一个常量,然后直接引用这个常量。 2.想要在js中动态设置样式中的值,在 css、scss等样式表中直接使用。 二、原因及解…...
数据治理在学术上的发展史以及未来展望
数据治理是大数据领域中非常重要的一环,从早期的学术研究到如今的各大企业落地实践,经历了漫长的过程,数据治理的实践落地本身也是一场马拉松。 从百度学术通过精确关键词匹配,搜索中文期刊的“数据治理” 和外文期刊的“data gov…...
【搭建博客】宝塔面板部署Typecho博客,并发布上线访问
目录 前言 1.安装环境 2.下载Typecho 3.创建站点 4.访问Typecho 5.安装cpolar 6.远程访问Typecho 7.固定远程访问地址 8.配置typecho 前言 Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴。Typecho基于PHP5开发,支持多种数据库&…...
【Spring篇】IOC相关内容
🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、bean基础配置 1.bean基础配置(id与class) 2.bean的name属性 3.bean作用范围scope配置 二、bean实例化 1.构造方法实例化 2.分析Spring的错误信息 3.静态工厂实例化 4.实例工厂 5.FactoryBean 三…...
Python超矩形
文章目录 距离函数矩形分割 Rectangle是 scipy.spatial中封装的类,其构造函数只需输入最小值和最大值的数组即可,并且可通过内置的 volume方法计算广义的体积。 from scipy.spatial import Rectanglerec Rectangle((0,0), (5,5)) print(rec.maxes) …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
