使用nohup命令 或者 代码创建守护进程

news/2024/4/16 13:12:46/文章来源:https://blog.csdn.net/challenglistic/article/details/128068707

目录

一、什么是守护进程?

1、守护进程的概念

2、为什么需要守护进程

二、理解进程组、会话、终端

三、创建守护进程的两种方式

1、nohup命令创建守护进程

2、代码创建守护进程

(1) 创建子进程,父进程退出

(2) 子进程创建新的会话

(3) 更改守护进程的工作目录

(4) 重新设置文件权限掩码

(5) 关闭文件描述符

(6) 完整代码 


一、什么是守护进程?

1、守护进程的概念

守护进程又叫精灵进程(Daemon Process),它是一个生存期较长的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。通常服务名称都是以 d 结尾,如http的守护进程 httpd、mysql 的守护进程 mysqld。

  • 始终在后台运行
  • 独立于控制终端(终端关闭不会影响到守护进程的关闭)
  • 生命周期较长,随系统启动和关闭

2、为什么需要守护进程

当我们在终端上运行一个 ./test 程序,./test 对应的进程就会依附于当前终端,一旦当前终端被关闭或者断开连接,那么这个进程也会被关闭。

如果是虚拟机的终端被关闭,意味着这个我们所运行的进程都会被关闭,无论是休眠进程还是僵尸进程,都会被关闭。

如果是连接远端服务器的Xshell被关闭,我们在Xshell上运行的程序也会被关闭,因为打开Xshell还是相当于在远程服务器上打开一个终端。

如果我们希望长期运行某个服务,而且该服务不会受到控制终端的影响,我们可以将我们要运行的程序创建成守护进程。守护进程是直接和系统绑定的,只要虚拟机或者远程服务器不关闭,守护进程就不会退出。

二、理解进程组、会话、终端

1、进程组

进程组是进程的集合,每个进程组都有一个组长,组长的ID就是该进程组的ID(PGID)。最简单的进程组就是父进程创建出了子进程,父子进程都在一个进程组里。

2、会话

会话是进程组的集合,建立会话的就是领导进程,该进程的ID就是会话的SID。会话中的每一个进程组被称为【作业】,会话可以包含一个前台进程组【前台作业】以及多个后台进程组【后台作业】。(会话首进程放到终端解释)

3、终端

一个会话可以有一个控制终端,建立会话和控制终端联系的会话首进程称为“控制进程”。控制终端的输入和输出都会被传递给会话中的前台进程组,以此来达到通过终端来控制会话中的多个作业的目的。

三、创建守护进程的两种方式

守护进程的创建有两种方式,第一种是通过nohup命令创建,第二种是通过代码创建。

1、nohup命令创建守护进程

首先我们先写一个简单的脚本 daemon.c,不让进程退出。

// daemon.c
#include <unistd.h>
#include <stdio.h>int main(){while(1){sleep(1); }return 0;
}

我们使用gcc 命令编译这个脚本得到执行文件 daemon,然后使用nohup 命令运行这个文件nohup命令的格式是

# 将程序变为守护进程
nohup xxxx &# 将程序变为守护进程,执行产生的信息输出到log文件
# 2>&1 的作用是标准输出和标准错误同等对待,都输出到log文件
nohup xxxx > log 2>&1 &

我们在命令行输入 nohup ./daemon & ,然后输入 ps ajx | grep ./daemon 查看是否运行成功

2、代码创建守护进程

使用代码创建守护进程可以更加直观地了解到守护进程的创建过程。代码创建守护进程一共分为五个步骤。

(1) 创建子进程,父进程退出

第一步就是让子进程成为孤儿,被init进程收养,此时子进程会转为后台运行,这是撇清关系的必要过程。

// fork返回值大于0代表父进程,等于0代表子进程
if(fork() > 0)    
{exit(0);
}

(2) 子进程创建新的会话

通过创建新的会话,让子进程脱离 init 进程,自己当家做主。

// setsid() 表示创建新的会话
// getsid() 表示根据会话ID获取会话领导进程的PID
if(setsid() < 0)
{exit(-1);
}

(3) 更改守护进程的工作目录

如果当前目录在日后可能会被移除,所以建议把守护进程的工作目录移动到其他工作目录下,比如根目录,因为守护进程一直在后台运行,其工作目录不能被卸载。

chdir("/");

(4) 重新设置文件权限掩码

新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。如果原本要设置的文件权限是 0666,普通用户的默认权限掩码是 0002,最终创建的文件权限是

更改权限掩码前:

        mask & ~umask = 666 & (~002) = 110110110 & 111111101 =  110110100 = 664

更改权限掩码为0后:

        mask & ~umask = 666 & (~000) = 110110110 & 111111111 = 110110110 = 666

因此,把文件权限掩码设置为  0,方便子进程更自由的控制文件权限。

if(umask(0) < 0)
{exit(-1);
}

(5) 关闭文件描述符

子进程被创建时,会继承父进程的三个标准输入输出流,因为守护进程不需要和终端交互,所以为了不受到终端的影响,需要关闭三个标准输入输出流。如Ctrl + C会发送终止进程的信号、Ctrl + Z会将前台进程转为后台进程。

如果需要输出信息,可以将执行过程中的信息输出到指定文件。

close(0);    // 关闭标准输入
close(1);    // 关闭标准输出
close(2);    // 关闭标准错误

(6) 完整代码 

pid_t pid = fork(); 
if (pid < 0) {perror("fork");exit(-1);        
}
else if (pid > 0) {exit(0);             // 1. 让父进程退出
}   
if (setsid() < 0)   
{perror("setsid");    // 2. 创建新的会话exit(-1);
}chdir("/");             // 3. 更改工作目录if(umask(0) < 0)        // 4. 设置权限掩码
{perror("umask");exit(-1);
}              close(0);               // 5. 关闭标准输入输出
close(1);   
close(2);    while(1)                // 守护进程开始执行任务
{// do something
}return 0;

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

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

相关文章

车载电子专用DC-DC方案PL5501

PL5501是一个同步4开关Buck-Boost能够调节输出电压的控制器高于或低于输入电压。PL5501运作输入电压范围从3.6 V到32 V (36 V Maximum)以支持各种应用程序。PL5501 buck采用恒ON时间控制&#xff0c;上位机采用升压和升压两种操作方式负荷和线路调节。开关频率可以设置为150kHz…

链式二叉树

链式二叉树一&#xff0c;相关函数接口实现1&#xff0c;前序遍历2&#xff0c;中序遍历3&#xff0c;后序遍历4&#xff0c;节点个数5&#xff0c;叶子结点个数6&#xff0c;树的高度7&#xff0c;第K层结点个数8&#xff0c;查找值为X的结点9&#xff0c;通过前序遍历数组构建…

关于虚拟机中IPI中断的思考

前言 感谢intel的vt-x技术&#xff0c;让虚拟机大部分指令可以直接运行在CPU中&#xff0c;只有少部分敏感指令需要有VMM来模拟执行。其中&#xff0c;每个CPU的LAPIC接收到的中断是虚拟化的开销一个大头。 LAPIC接收到的中断分为外部中断&#xff0c;内部中断&#xff0c;IP…

【SQL Server + MySQL三】数据库设计【ER模型+UML模型+范式】 + 数据库安全性

极其感动&#xff01;&#xff01;&#xff01;当时学数据库的时候&#xff0c;没白学&#xff01;&#xff01; 时隔很长时间回去看数据库的笔记都能看懂&#xff0c;每次都靠这份笔记巩固真的是语雀分享要花钱&#xff0c;要不一定把笔记给贴出来(;༎ຶД༎ຶ) &#xff0c;除…

第2-4-8章 规则引擎Drools实战(1)-个人所得税计算器

文章目录9. Drools实战9.1 个人所得税计算器9.1.1 名词解释9.1.2 计算规则9.1.2.1 新税制主要有哪些变化&#xff1f;9.1.2.2 资较高人员本次个税较少&#xff0c;可能到年底扣税增加&#xff1f;9.1.2.3 关于年度汇算清缴9.1.2.4 个人所得税预扣率表&#xff08;居民个人工资、…

LeetCode - 76 最小覆盖子串

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回…

iClient for Leaflet设置地图掩膜

作者&#xff1a;lly 文章目录背景一、实现思路二、步骤代码三、完整代码背景 最近很多小伙伴需要只展示地图的某个行政区域&#xff0c;由于地图存在多个图层&#xff0c;所以图层过滤的方式并不能很好的适用&#xff0c;这个时候&#xff0c;我们可以考虑给地图覆盖一层掩膜…

界面控件DevExpress WPF的主题设计器,可轻松完成应用主题研发

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

双十二薅羊毛!这几款数码好物不可错过

双十二即将开始&#xff0c;在这段时间里有的人已经将自己心仪的塞满了整个购物车了吧&#xff0c;而有的人还没想好到底要入手什么&#xff0c;如果你也是还在纠结的话&#xff0c;不知道该买什么又或是想知道哪些产品更适合你入手&#xff0c;不妨来看看小编今天为你带来的这…

MySQL第一弹

目录 一、数据库的基本概念 1、数据 (Data) 2、表 3、数据库 4、数据库管理系统(DBMS) 5、数据库系统 6、DBMS的工作模式如下 二、数据库的发展史 1.第一代数据库&#xff08;淘汰&#xff09; 2.第二代数据库&#xff08;现在用的基本上都是二代&#xff09; 3.第…

亲戚小孩月薪17k,而我只有4k+,好慌......

我们总是在悲观与乐观中反复折磨自己&#xff0c;感觉自己一事无成。总是眼高手低&#xff0c;总以为大运会砸到自己&#xff0c;遇到挫折就会感到很沮丧。 大学四年没考到英语六级证书&#xff0c;小学教资考了两次。现在想要考研&#xff0c;但总是觉得来不及&#xff0c;或…

磁盘划分和磁盘格式化

文章目录列出装置的 UUID 等参数parted 列出磁盘的分区表类型与分区信息磁盘分区&#xff1a;gdisk、fdisk用 gdisk 新增分区槽用 gdisk 删除一个分区槽磁盘格式化&#xff08;建立文件系统&#xff09;XFS 文件系统 mkfs.xfsXFS 文件系统 for RAID 效能优化&#xff08;Option…

java中csv导出-追加-列转行

1、问题描述 业务数据量比较大&#xff0c;业务上查询条件写入数据库&#xff0c;java定时去读&#xff0c;然后导出csv&#xff0c;供用户下载&#xff0c;因为有模板要求&#xff0c;前一部分是统计信息&#xff0c;后一部分是明细信息&#xff1b;首先csv中写入统计信息&am…

IDEA的日常快捷键大全

更多内容在&#xff1a;https://javaxiaobear.gitee.io/ ​​​​​​第1组&#xff1a;通用型 说明 快捷键 复制代码-copy ctrl c 粘贴-paste ctrl v 剪切-cut ctrl x 撤销-undo ctrl z 反撤销-redo ctrl shift z 保存-save all ctrl s 全选-select all …

Python连接Clickhouse遇坑篇,耗时一天成功连接!

首先&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要看网上那些乱七八糟的使用clickhouse-driver连接了&#xff0c;真tm难用&#xff0c;端口能搞死你那种&#xff0c;超级烦&#xff01; 推荐直接看官方…

数商云SRM系统招标流程分享,助力建筑材料企业降低采购成本,提高采购效率

近年来&#xff0c;随着主管部门对房地产市场的监管非常严格&#xff0c;房地产业的发展已进入瓶颈期&#xff0c;这对与房地产业密切相关的建材行业产生了很大的影响。同时&#xff0c;我国城市化进入成熟期&#xff0c;行业规模发展动力减弱&#xff0c;建材行业增长压力明显…

Kotlin高仿微信-第8篇-单聊

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

VauditDemo靶场代码审计

靶场搭建 将下载好的VAuditDemo_Debug目录复制到phpstudy的www目录下&#xff0c;然后将其文件名字修改成VAuditDemo&#xff0c;当然你也可以修改成其他的 运行phpstudy并且访问install目录下的install.php&#xff0c;这里我访问的是http://127.0.0.1/VAuditDemo/install/in…

竞赛——【蓝桥杯】2022年12月第十四届蓝桥杯模拟赛第二期C/C++

1、最小的2022 问题描述 请找到一个大于 2022 的最小数&#xff0c;这个数转换成二进制之后&#xff0c;最低的 6 个二进制为全为 0 。 请将这个数的十进制形式作为答案提交。 答案提交 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数…

Java学习之继承练习题

目录 第一题 代码 输出流程分析 运行结果 考察知识点 第二题 代码 流程分析 运行结果 第三题 题目要求 我的代码 代码改进 第一题 代码 package com.hspedu.extends_.exercise;public class ExtendsExercise01 {public static void main(String[] args) {B b new …