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

news2025/1/15 12:59:03

目录

一、什么是守护进程?

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.coloradmin.cn/o/45090.html

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

相关文章

jsp美食共享平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 美食共享平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用mvc开发结构 serlvetdaobean模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.0,Myecl…

二叉树链式结构-c语言实现

文章目录二叉树链式结构实现1. 链式二叉树结构2. 二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历3. 常见功能3.1 二叉树结点个数3.2 二叉树叶子结点个数3.3 第K层结点的个数3.4 二叉树的深度3.5 判断是不是树是不是完全二叉树3.6 在二叉树中查找值为x的结点3.7…

VM系列振弦采集读数模块的测量模式

VM系列振弦采集读数模块的测量模式 模块有连续测量和单次测量两种测量模式&#xff0c; 通过向测量模式寄存器 WKMOD.[0]写入 1 使模块工作于连续测量工作模式&#xff0c; 写入 0 使模块工作于单次测量工作模式。 WKMOD.[15]用来设置是否在模块“ 忙” 时禁用数字接口&#xf…

京东低代码平台:水滴表单联动可视化配置的实现与思考

TL;DR drip-form在0.9.0的alpha版支持了可视化配置联动的功能&#xff08;仍在测试中&#xff09;drip-form通过协议到代码的转换&#xff0c;尽可能降低常见联动配置的开发成本探讨&#xff1a;JSON diff动态生成常见联动和校验drip form的后续更新&#xff1a;v0.9.0是v0最后…

计算机组成原理-总线详细讲解(持续更新中)

总线概念与分类 定义 总线是一组能为多个部件分时共享的公共信息传送线路 共享是指总线上可以挂接多个部件&#xff0c;各个部件之间互相交换的信息都可以通过这组线路分时共享。 分时是指同一时刻只允许有一个部件向总线发送信息&#xff0c;如果系统中有多个部件&#xf…

React源码分析1-jsx转换及React.createElement

jsx 的转换 我们从 react 应用的入口开始对源码进行分析&#xff0c;创建一个简单的 hello, world 应用&#xff1a; import React, { Component } from react; import ReactDOM from react-dom; export default class App extends Component {render() {return <div>h…

科普下抖音的规则,为什么别人的内容很容易火,而我的很难?

今天给大家科普下抖音的规则&#xff0c;为什么别人的内容很容易火&#xff0c;而我的很难&#xff1f; 上一篇给大家讲了现在做抖音还来得及么&#xff1f;肯定的回答&#xff0c;一直都来得及。 既然来得及&#xff0c;那么我们怎么才能做好抖音呢&#xff1f; 在我看来&a…

Rust 基础(四)

十、泛型、Traits和生命周期 每种编程语言都有有效处理概念重复的工具。在Rust中&#xff0c;一个这样的工具就是泛型:具体类型或其他属性的抽象替身。我们可以表达泛型的行为&#xff0c;或者它们如何与其他泛型相关联&#xff0c;而不知道在编译和运行代码时它们的位置会是什…

[C++]C++入门--引用

​ &#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 博主Gitee 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎>在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode…

IPv6进阶:IPv6 过渡技术之IPv6 over IPv4 手动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4环境&#xff1b;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备&#xff1b;在R1及R2上部署IPv6 over IPv4手工隧道使得PC1及PC2能够互相访问。 配置及实现 R3的配置如下 [R3] interface GigabitEthernet0/0/0 [R3-Gigabi…

【Java实战】工作中如何规范控制语句

目录 一、前言 二、控制语句规范 1.【强制】使用switch注意事项 2.【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时&#xff0c;必须先进行 null 判断。 3.【强制】在 if / else / for / while / do 语句中必须使用大括号。 4.【强制】三目运算符高…

[附源码]计算机毕业设计springboot本地助农产品销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C++】string详细介绍及模拟实现string类

【C】string详细介绍及模拟实现string类 文章目录【C】string详细介绍及模拟实现string类1.什么是string2.string常用接口介绍2.1string类对象的常见构造2.2string类对象的容量操作2.3string类对象的访问及遍历操作2.4string类对象的修改操作2.5string类非成员函数3.string类的…

移动跨平台开发跨家选型参考建议

从 iPhone 诞生至今&#xff0c;智能手机风靡全球已将近20年&#xff0c;智能手机操作系统 iOS 和 Android 也成为当仁不让的顶流般的存在&#xff0c;而作为其背后的灵魂&#xff0c;移动应用也随着技术的发展已经越来越丰富。如果从技术层面来讲&#xff0c;移动 App 也从最开…

Cloud-computing 实验镜像 chinaskills_cloud_iaas.iso chinaskills_cloud_paas.iso

Cloud-computing 实验镜像 最近因新项目再次进行云计算环境的搭建&#xff0c; 找这两个镜像&#xff08; 找chinaskills_cloud_paas.iso chinaskills_cloud_iaas.iso&#xff09;颇为费劲&#xff0c;用尽九牛二虎之力总算找到了&#xff0c;该大侠还分享了诸多系统镜像和完…

高衍射效率的偏振无关透射光栅的分析与设计

摘要 光栅&#xff0c;特别是具有与波长相当的特征尺寸的光栅&#xff0c;具有偏振相关的光学特性。 这使得设计的具有高衍射效率的光栅难以用于任意偏振。 根据文献[T. Clausnitzer, et al&#xff0c;Proc. SPIE 5252,174-182&#xff08;2003&#xff09;]中报道的概念&…

VMware-AD域控管理

目录 新建AD用户[ 以张三[zhangsan]、李四[lisi]为例 ] 2.用户信息-属性-管理-编辑&#xff1a; 3.将张三设置为AD域控管理员&#xff0c; 在wqd.com域下新建几个部门&#xff08;IT、HR、PRD&#xff09; 对从主机&#xff08;win7&#xff09;进行AD接管 修改win7计算机名称&…

MATLB|电动车智能充电模式及电力高峰需求预测

目录 0 写在前面 1 电动车 1.1 电动车&#xff08;EV&#xff09; 1.2 电动汽车充电 1.3 智能充电和车联网&#xff08;V2G&#xff09; 1.4 V2G 应用 1.5 可再生能源可用性 1.6 基于价格的收费 2 电动车智能充电 2.1 智能充电 2.2 实时电价 2.3 智能充电模式——算…

国产CPU对比

关于国产CPU&#xff1a;龙芯、飞腾、鲲鹏、海光、申威、兆芯 CPU 是计算机系统的核心和大脑 n CPU&#xff0c;即中央处理器是计算机的运算和控制核心&#xff0c;其功能主要是解释计算机指令以及处理计算机软件中的数据. CISC实际上是以增加处理器本身复杂度作为代价&#xf…

论文翻译:多延迟块频域自适应滤波器

Multidelay Block Frequency Domain Adaptive Filter 作者&#xff1a; JIA-SIEN SOO 和 KHEE K. PANG 文章目录Multidelay Block Frequency Domain Adaptive Filter1.介绍2.MDF自适应滤波器3.仿真结果和性能分析4.计算的复杂性5.结论摘要-本文提出了一种灵活的多延迟块频域自…