当前位置: 首页 > news >正文

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

目录

前言

一、进程组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进程,让子进程去setsidif (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命令。

 代码链接

相关文章:

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

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前&#xff0c;我们学习过socket编程中的udp通信与tcp通信&#xff0c;但是当时我们服务器启动的时候&#xff0c;都是以前台进程的方式启动的&#xff0c;这样很不优雅&#xff0c…...

安卓开发--按键跳转页面,按键按下变色

前面已经介绍了一个空白按键工程的建立以及响应方式&#xff0c;可以参考这里&#xff1a;安卓开发–新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应。 安卓开发是页面跳转是基础&#xff01;&#xff01;&#xff01;所以本篇博客介绍利用按键实现页面跳转&#…...

Ps基础学习笔记

Ps基础学习笔记 Adobe Photoshop&#xff08;简称Ps&#xff09;是一款非常流行的图像处理软件&#xff0c;被广泛应用于图像编辑、修饰和设计等领域。作为一名初学者&#xff0c;了解Ps的基础知识是非常重要的&#xff0c;本文将介绍Ps的基本操作和常用工具&#xff0c;帮助你…...

spring开发问题总结(持续更新)

开始 最近在做项目的时候&#xff0c;总遇到一些大小不一&#xff0c;奇形怪状的问题。 现在终于有时间来总结一下遇到的问题&#xff0c;以备复习之用。 以下提到的问题经过简化&#xff0c;不代表任何项目代码或问题。 问题1&#xff1a;未完成任务状态搜索结果有误&#x…...

Android 状态栏WiFi图标的显示逻辑

1. 状态栏信号图标 1.1 WIFI信号显示 WIFI信号在状态栏的显示如下图所示 当WiFi状态为关闭时&#xff0c;状态栏不会有任何显示。当WiFi状态打开时&#xff0c;会如上图所示&#xff0c;左侧表示有可用WiFi&#xff0c;右侧表示当前WiFi打开但未连接。 当WiFi状态连接时&#x…...

更改 DeepXDE 的后端

DeepXDE 库为科学计算和工程优化等领域提供了深度学习方法&#xff0c;是一个非常有用的工具。其中一个重要的功能是它允许用户自定义后端。在本文中&#xff0c;我们将指导如何更改 DeepXDE 的后端&#xff0c;并且验证更改是否成功。 更改 DeepXDE 的后端 DeepXDE 支持多种…...

SpringBoot之Zuul服务

概述 Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤。 目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记…...

Go-变量

可以理解为一个昵称 以后这个昵称就代指这些信息 var sg string "czy" 声明赋值 package mainimport "fmt"func main() {var sg string "陈政洋"fmt.Println(sg)var age int 73fmt.Println(age)var flag bool truefmt.Println(flag) } …...

【CTF-Crypto】RSA-选择明密文攻击 一文通

RSA&#xff1a;选择明密文攻击 关于选择明/密文攻击&#xff0c;其实这一般是打一套组合拳的&#xff0c;在网上找到了利用的思路&#xff0c;感觉下面这个题目是真正将这个问题实现了&#xff0c;所以还是非常棒的一道题&#xff0c;下面先了解一下该知识点&#xff1a;(来自…...

Pytorch基础:torch.expand() 和 torch.repeat()

在torch中&#xff0c;如果要改变某一个tensor的维度&#xff0c;可以利用view、expand、repeat、transpose和permute等方法&#xff0c;这里对这些方法的一些容易混淆的地方做个总结。 expand和repeat函数是pytorch中常用于进行张量数据复制和维度扩展的函数&#xff0c;但其…...

如何正确安装Scrapy 2.6.1并解决常见的Python环境问题

在配置Python环境和安装包时&#xff0c;常常会遇到版本冲突和路径问题&#xff0c;特别是当系统中存在多个Python版本时。本文将指导你如何在CentOS系统中正确使用pip3安装Scrapy 2.6.1&#xff0c;并解决一些常见的环境问题。 步骤1: 确认和升级 pip3 确认 pip3 的版本&…...

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…...

关于模型参数融合的思考

模型参数融合通常指的是在训练过程中或训练完成后将不同模型的参数以某种方式结合起来&#xff0c;以期望得到更好的性能。这种融合可以在不同的层面上进行&#xff0c;例如在神经网络的不同层之间&#xff0c;或者是在完全不同的模型之间。模型参数融合的目的是结合不同模型的…...

Windows MySQL本地服务器设置并导入数据库和数据

文章目录 小结问题及解决导出数据库Windows MySQL本地服务器设置导入数据库和数据 参考 小结 最近需要在本地Windows环境中设置MySQL服务器&#xff0c;并导入数据库和数据&#xff0c;记录过程。 问题及解决 导出数据库 首先需要导出数据库&#xff1a; C:\mysql-8.0.37-…...

豪投巨资,澳大利亚在追逐海市蜃楼吗?

澳大利亚政府正在积极投资于量子计算领域。继2021年向量子技术投资逾1亿澳元后&#xff0c;2023年5月&#xff0c;该国发布了首个国家量子战略&#xff0c;详细阐述了如何把握量子技术的未来及保持全球领先地位。 澳大利亚的国家量子战略概述 原文链接&#xff1a; https://ww…...

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…...

05_kafka-整合springboot

文章目录 kafka 整合 springboot pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version> </parent> <dependencies>&…...

论UML在学情精准测评系统中的应用

摘要简介 项目背景&#xff1a; 随着教育改革的不断深入&#xff0c;对学生学情的精准测评成为教育教学工作中的重要环节。为了解决传统学情测评方式主观性强、效率低、反馈不及时等问题&#xff0c;我们团队受教育主管部门委托&#xff0c;承担了中小学学情精准测评系统&…...

Day23 代码随想录打卡|字符串篇---重复的子字符串

题目&#xff08;leecode T459&#xff09;&#xff1a; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。fang 移动匹配。分析可以由自己的子串构成的字符串&#xff0c;肯…...

【win10 文件夹数量和看到不一致查看隐藏文件已经打开,Thumb文件作妖】

目录 任务介绍&#xff1a;重命名规则修改前修改后 实现思路VB代码实现BUG犯罪现场&#xff08;眼见不一定为实&#xff09;破案1&#xff1a;抓顶风作案的反贼&#xff01;&#xff01;&#xff01;破案2&#xff1a;破隐身抓刺客&#xff01;&#xff01;&#xff01;杀器&am…...

OpenClaw-Skills:模块化自动化技能库的设计、开发与编排实战

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目&#xff0c;叫blessonism/openclaw-skills。光看名字&#xff0c;你可能会有点摸不着头脑&#xff0c;这“OpenClaw”和“Skills”组合在一起&#xff0c;到底想干什么&#xff1f;作为一个在开源社区和自动化工具领…...

Python自动化交易:Kalshi预测市场API封装与量化策略实践

1. 项目概述&#xff1a;一个为Kalshi预测市场打造的自动化工具箱如果你对预测市场感兴趣&#xff0c;或者正在寻找一种程序化的方式来管理你在Kalshi平台上的交易活动&#xff0c;那么你可能会对这个名为kalshi-skill的项目产生共鸣。简单来说&#xff0c;这是一个基于Python的…...

保姆级避坑指南:用GGCNN源码处理Cornell抓取数据集,解决tiff文件生成失败问题

GGCNN源码实战&#xff1a;Cornell数据集预处理深度排错指南 第一次运行GGCNN的Cornell数据集预处理脚本时&#xff0c;我盯着毫无反应的终端窗口足足等了十分钟——没有进度条&#xff0c;没有错误提示&#xff0c;只有光标在无情地闪烁。这大概是每个复现论文的开发者都会经历…...

告别答辩PPT焦虑:百考通AI如何帮你高效搞定毕业答辩

简洁专业的PPT模板&#xff0c;精准的AI内容生成&#xff0c;在线编辑与一键美化——让毕业答辩的最后一步走得更从容。 又到了一年毕业季&#xff0c;当论文终于定稿&#xff0c;你是否发现自己又面临一座新的大山——毕业答辩PPT&#xff1f;面对几十页的论文文档&#xff0c…...

2025届学术党必备的五大降重复率方案横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下知网已然上线了AI检测功能&#xff0c;会针对论文里疑似人工智能生成的内容展开识别。为…...

Windows 11任务栏拖放功能终极修复指南:3步恢复高效操作体验

Windows 11任务栏拖放功能终极修复指南&#xff1a;3步恢复高效操作体验 【免费下载链接】Windows11DragAndDropToTaskbarFix "Windows 11 Drag & Drop to the Taskbar (Fix)" fixes the missing "Drag & Drop to the Taskbar" support in Windows…...

在Windows上安装Android应用:APK Installer让跨平台操作变得简单

在Windows上安装Android应用&#xff1a;APK Installer让跨平台操作变得简单 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想过在Windows电脑上直接运行Androi…...

[具身智能-653]:人的大脑神经网络就是天然的模拟电路,还是数字电路?

结论先给&#xff1a;人脑神经网络&#xff0c;本质是【天然模拟电路】&#xff0c;不是数字电路这和前面聊的模拟电路频域特性、硬件隐式频域滤波完全同逻辑。一、先分清&#xff1a;数字电路 vs 模拟电路 核心区别数字电路只有0、1两种离散电平&#xff0c;跳变是阶跃式&…...

ాలుWindows上的安卓应用安装器APK Installer:打破平台壁垒的轻量级解决方案

#ాలుWindows上的安卓应用安装器APK Installer&#xff1a;打破平台壁垒的轻量级解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字生态日益多元化的今天…...

Java集成OpenAI全攻略:从SDK选型到企业级应用实战

1. 项目概述与核心价值最近在折腾一个内部的知识库问答机器人&#xff0c;后端服务用Java写的&#xff0c;自然就想找个好用的OpenAI SDK来对接。市面上Java的客户端库不少&#xff0c;但要么封装得过于简单&#xff0c;很多高级功能没有&#xff0c;要么就是更新不及时&#x…...