Linux——守护进程化(独立于用户会话的进程)

news2024/11/16 5:29:04

目录

前言

一、进程组ID与会话ID

二、setsid()  创建新会话

三、daemon 守护进程


前言

在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅,因为前台进程无法接受命令输入,同时也可能一不小心被使用者终止。因此我们得让服务器以守护进程的方式进行运行。如果不太了解,可以看这篇文章前台进程与后台进程。

一、进程组ID与会话ID

我们输入 指令 ps axj 可以找到当前系统中的所有进程,并且查看如下各种信息。

  • PPID: 父进程ID。
  • PID: 进程ID。
  • PGID: 进程组ID。
  • SID: 会话ID。
  • TTY: 与进程关联的终端类型(如果有的话)。
  • TPGID: 终端的前台进程组ID(如果有的话)。
  • STAT: 进程状态(例如,S表示休眠,R表示运行等)。
  • UID: 用户ID,表示运行该进程的用户。
  • TIME: CPU时间,表示进程使用的CPU时间总量。
  • COMMAND: 启动进程的命令名或命令行。

我们主要来看进程组ID PGID 和会话ID SID。

如下,启动一个sleep进程,查询sleep进程的信息。发现sleep进程的组 PGID 就是自己的PID,PPID 就是bash进程的ID。也就是说该sleep自成进程组。 同时进程组默认是在一个会话中的。

如果我们又打开一个bash,一个命令创建三个sleep,会发现他们的PGID都是第一个创建的进程PID,同时SID都是bash。

他们的关系如下图所示。任何时刻,一个会话可以有很多进程组,bash是一个组,sleep1000 | sleep 2000 | sleep 3000 又是一个进程组,sleep 10000也是一个进程组。但默认情况只允许一个进程组在前台。

也就是说bash在前台的话, 命令行就能接受命令,如果前台被其他进程占据,那么bash就会退回到后台,也就无法接受命令了

因此,如果我们启动的服务器程序,是在当前会话中,那么当bash退出(shell关闭),或者被不小心kill 掉,那么我们的服务器也会随之崩溃。

如果想让服务器不受xshell用户登录和退出的影响,就要让服务器程序自成一个会话,不隶属于任何一个bash。这就是守护进程

二、setsid()  创建新会话

setsid() 可以创建一个新会话,调用之后,当前进程会与原会话和进程组脱离关系。这意味着进程不再属于原来的会话和进程组,而是成为新会话的领头进程,并可能创建一个新的进程组。

但是他有一个前提,调用setsid的进程不能是进程组的组长

也就是说之前的sleep 1000 | sleep 2000 | sleep 30000 中,sleep 1000进程是进程组的组长,那么他就无法使用setsid。

同时,如果当前进程组只有一个进程,那就默认该进程就是组长,也无法使用setsid。

那么我们处理方式也很简单,让进程fork一下,使用子进程去setsid即可。也就是说守护进程一定就是孤儿进程

三、daemon 守护进程

对于具体的进程守护化,我们通常需要做如下内容

  1. 忽略可能一起进程异常退出的信号
  2. fork进程,让子进程去调用setsid()
  3. 改变cwd(当前工作目录),可选可不选,如果让cwd变为根目录,想误删也就不太可能,同时访问速度也会更快一点。
  4. 处理用户的标准输入、标准输出、标准错误。守护进程化后,通常不需要直接与用户进行交互,避免资源浪费和潜在的问题。
#pragma once

#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>

//该文件相当于垃圾箱,往里面cout、cerr就相当于丢弃数据,cin相当于直接读到文件末尾
const char *dev_null = "/dev/null";

void deamon(bool ischidr, bool isclose)
{
    // 1.忽略可能引起进程异常退出的信号
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    // 2.fork进程,让子进程去setsid
    if (fork() > 0)
        exit(0);
    setsid();

    // 3.改变当前工作目录
    if (ischidr)
        chdir("/");

    // 4.处理用户的输入输出与错误
    int fd = open(dev_null, O_RDWR);
    if (isclose)
    {
        //直接关闭
        close(0);
        close(1);
        close(2);
    }
    else
    {
        if (fd > 0)
        {
            dup2(fd, 1);
            dup2(fd, 2);
            dup2(fd, 3);
            close(fd);
        }
    }
}

 库里面也有daemon函数,我们也是模仿库里面写的,但是自己写的daemon可控性会更高一些。

那么现在就可以对服务器(之前写的Tcp服务器)进程处理,直接调用deamon,同时日志的作用也体现出来了,将需要的消息放到日志中。

这样也能正常运行,并将进程守护化了,关闭shell也无法将线程退出,需要关闭机器或者使用kill命令。

 代码链接

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

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

相关文章

【LinuxC语言】setitimer与getitimer函数

文章目录 前言一、setitimer() 函数二、getitimer() 函数三、示例代码总结 前言 在Linux系统下&#xff0c;编写程序时经常需要使用定时器来实现一些定时任务、超时处理等功能。setitimer() 和 getitimer() 函数是两个用于操作定时器的重要函数。它们可以帮助我们设置定时器的…

第19章 基于质量特性的测试技术

一、功能性测试 &#xff08;一&#xff09;测试方法 等价类边界值法因果图法判定表法场景法 &#xff08;二&#xff09;用例 1、正常用例 2、异常用例 &#xff08;三&#xff09;完备性 1、功能覆盖率 2、X1-A/B 功能覆盖率X&#xff1a;软件实际功能覆盖文档中所有…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来&#xff0c;形成一个相互通信和共享资源的系统。 &#xff08;1&#xff09; 独立模式 独立模式 &#xff1a; 计算机之间相互独立。 &#xff08;2&#xff09;…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”&#xff0c;必须根目录下的某个文件夹&#xff0c;或者其子文件夹 …

在线OJ——链表经典例题详解

引言&#xff1a;本篇博客详细讲解了关于链表的三个经典例题&#xff0c;分别是&#xff1a;环形链表&#xff08;简单&#xff09;&#xff0c;环形链表Ⅱ&#xff08;中等&#xff09;&#xff0c;随机链表的复制&#xff08;中等&#xff09;。当你能毫无压力地听懂和成功地…

面试中算法(使用栈实现队列)

使用栈来模拟一个队列&#xff0c;要求实现队列的两个基本操作:入队、出队。 栈的特点&#xff1a;先入后出&#xff0c;出入元素都是在同一端&#xff08;栈顶&#xff09;。 队列的特点&#xff1a;先入先出&#xff0c;出入元素是在两端&#xff08;队头和队尾)。 分析&…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏&#xff1a;【机器学习&#xff1a;项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学习模型、处理非…

springboot+vue课程作业成绩可视化大屏分析系统

教师的登录功能。 教师需要可以拥有每学期新增课程的功能。 新增的课程有作业成绩&#xff0c;考勤成绩&#xff0c;考试成绩&#xff0c;实验成绩&#xff0c;其中作业成绩是平时作业1到作业8的平均成绩&#xff0c;最后根据占比得出学期的总评成绩。&#xff08;参考我发的表…

Shell编程debug

debug调试 debug方法 sh -x显示脚本执行过程set命令设置开始debug和结束debug的位置显示脚本某一部分执行过程&#xff0c;解决复杂脚本故障 示例&#xff1a; sh -x 显示脚本执行过程 set显示脚本的部分执行过程 set -x 开始调试&#xff0c;从这里开始显示脚本的详细执行过…

【C++】模板初阶:泛型编程的起点

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

day02-分布式事务

1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xf…

鸿蒙组件样式复用简介

鸿蒙组件样式复用简介 使用Style进行复用在Component内部复用在Component外部复用使用Extend复用指定类型组件Extend支持参数传递 使用Style进行复用 在页面开发过程中&#xff0c;会遇到多个组件都在使用相同的样式&#xff0c;这时候就要考虑是不是可以将相同的样式的进行复…

Python中的`return`语句详解

Python中的return语句详解 对于初学Python或任何编程语言的人来说&#xff0c;理解函数如何返回值是非常重要的。在Python中&#xff0c;return语句用于从函数中返回结果。本篇博客将详细介绍return语句的基本用法&#xff0c;以及如何在不同情境中有效使用它。 什么是return…

mac安装虚拟机linux系统

需要下载的有&#xff1a;centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有&#xff1a; CentOS、ubuntu、redhat&#xff0c;选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

cloudreve离线下载报错Insufficient capacity

报错内容&#xff1a; [Warning] 2024-05-03 22:57:40 Failed to update status of download task "c0xxxxxxxxx749": Insufficient capacity 使用motrix作为离线程序&#xff0c;报错后&#xff0c;会自动暂停下载 报错原因&#xff1a; 初始容量只有1G&#xff0c…

算法提高之潜水员

算法提高之潜水员 核心思想&#xff1a;二维01背包 两个容量v1v2注意状态计算时j和p可以<各自的v #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1010,M 80,K 22;int f[K][M];int k,V1,V2;int main(){ci…

中国真实婚恋相亲服务平台有哪些?分享7款专注相亲交友的脱单软件平台

终于脱单了&#xff0c;盘点一下&#xff0c;我都有用过哪些脱单App&#xff5e; 第一个&#xff0c;珍爱网&#xff0c;作为老牌相亲软件&#xff0c;拥有线上和线下门店服务&#xff0c;海量会员。优点&#xff1a;资源多&#xff0c;软件使用界面整洁干净&#xff0c;设计人…

关于 Vue.js 双向数据绑定基本实现认知

写在前面 很早的一篇博客&#xff0c;整理了部分&#xff0c;蹭假期整理完博文内容涉及:双向数据绑定 实现方式简单介绍基于发布订阅、数据劫持的双向数据绑定两种不同实现(ES5/ES6) Demo&#xff0c;以及代码简单分析Object.defineProperty && Proxy API 介绍以及特性…

Web API之BOM

BOM 一、window的常见事件1.窗口加载事件2. 调节窗口大小事件 二、定时器1.setTimeout( , )2.setInterval()3.发送短信例子4.this指向问题 三、js执行机制四、location对象1.常见属性2.例子、3.常见方法 五、navigator对象六、history对象 简介&#xff1a; BOM是浏览器对象模型…

python数据分析中数据可视化简单入门

1.折线图表 首先引入相关包pyecharts&#xff0c;如果没下载可以先下载 pip install pyecharts from pyecharts.charts import Lineline Line() # 添加x轴 line.add_xaxis([呱了个呱,羊村,牟多,蜂地,喵帕斯]) # 添加y轴 line.add_yaxis("GDP",[50,30,40,34,63,22])…