Linux高阶——1027—守护进程

ops/2024/11/2 12:29:18/

1、守护进程的基本流程

1、父进程创建子进程,父进程退出

守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力

2、子进程(守护进程)脱离控制终端,创建新会话

3、将守护进程中无用的描述符关闭(STDOUT|STDIN)

将STDERROR重定向到文件中,避免屏幕抛出异常信息,避免在使用前台时,后台的守护进程输出到屏幕上

需要把标准出错也要关闭,STDERR_FILENO,标准出错指的是,当使用open函数打开一个不存在文件时,会在终端上显示出来的错误

重定向函数dup和dup2

错误信息会通过STDERR_FILENO将异常抛出到显示器上,因此需要将错误信息重定向,不使用STDERR_FILENO流,而使用输出错误文件的文件描述符fd流

4、将守护进程的工作路径变为根目录

进程默认的工作目录一般为执行程序目录(app)

将默认工作目录(usb)改为目标电脑的根目录,避免工作目录丢失

5、修改进程umask文件权限掩码,变为0002

一般创建文件,文件权限是0664,6表示所有者权限,6表示同组用户权限,4表示其他人权限

一般电脑上初始权限mod为0666,但要与mask掩码0002做取反求与运算,得到0664

开发机的mod初始权限是0666,电脑权限掩码为0002,但目标主机的默认掩码不一定等于0002

将进程掩码改为0002,当进程创建文件时,创建出的文件掩码一定为0002

6、执行守护进程任务(间隔执行|条件触发|定时触发)

7、守护进程退出处理

测试任务

获取时间函数

用户传入数组地址,此函数将字符串时间写入数组中

设定数组中每个元素为time_t类型的变量tp

使用bzero函数初始化数组

使用time函数获取时间种子,赋值给tp

将时间种子tp传入ctime_r函数,计算出当前时间

ctime_r函数最后的返回值带'\n',因此使用tm[strlen(tm)-1]='\0'将'\n'去除

int Get_time(char* tm) 
{time_t tp; bzero(tm,1024);tp=time(NULL);ctime_r(&tp,tm);tm[strlen(tm)-1]='\0';return 0;
}

创建进程的工作

void daemon_job(void)
{int fd;if((fd=open("system.log",O_RDWR|O_CREAT,0664))==-1){perror("open failed");}char tm[1024];char log_info[4096];while(1){Get_time(tm);sprintf(log_info,"<%s>WARING war informatcion...\n",tm);write(fd,log_info,strlen(log_info));bzero(log_info,sizeof(log_info));bzero(tm,sizeof(tm));sleep(3);}
}

 创建守护进程

int create_daemon(void)
{pid_t pid;int efd;efd=open("ERROR_MSG",O_RDWR|O_CREAT,0664);pid=fork();if(pid>0){exit(0);}else if(pid==0){setsid();close(STDIN_FILENO);close(STDOUT_FILENO);dup2(efd,STDERR_FILENO);chdir("./");umask(0002);daemon_job();}else{perror("fork call failed");}return 0;
}

 总代码

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<signal.h>
#include<pthread.h>
#include<sys/fcntl.h>
#include<string.h>int Get_time(char* tm) 
{time_t tp; bzero(tm,1024);tp=time(NULL);ctime_r(&tp,tm);tm[strlen(tm)-1]='\0';return 0;
}void daemon_job(void)
{int fd;if((fd=open("system.log",O_RDWR|O_CREAT,0664))==-1){perror("open failed");}char tm[1024];char log_info[4096];while(1){Get_time(tm);sprintf(log_info,"<%s>WARING war informatcion...\n",tm);write(fd,log_info,strlen(log_info));bzero(log_info,sizeof(log_info));bzero(tm,sizeof(tm));sleep(3);}
}int create_daemon(void)
{pid_t pid;int efd;efd=open("ERROR_MSG",O_RDWR|O_CREAT,0664);pid=fork();if(pid>0){exit(0);}else if(pid==0){setsid();close(STDIN_FILENO);close(STDOUT_FILENO);dup2(efd,STDERR_FILENO);chdir("./");umask(0002);daemon_job();}else{perror("fork call failed");}return 0;
}int main()
{create_daemon();return 0;
}

创建一个system.log的日志文件,每隔3秒,向日志文件中写入当前系统时间

eg:<系统时间>WARNING,test war message

2、实现Linux操作系统开机启动

shell脚本

脚本池里有许多脚本,每个脚本可以启动一个程序

虚拟机操作系统LINUX OS启动时,会将脚本池里的所有shell脚本对应的程序启动

编写一个shell脚本,让此脚本可以定位并启动守护程序

步骤:

1、将脚本放进系统脚本文件夹/etc/init.d/

2、将自定义脚本通过update-rc.d加入系统脚本池

3、!/bin/bash声明脚本中使用的shell版本

sudo mv start_daemon /etc/init.d/

cd /etc/init.d

sudo update-rc.d shell_name start 99 2.——添加启动

sudo update-rc.d shell_name remove——删除启动

shell脚本——命令的容器,可以将大量命令写入脚本,最后进行批量执行和处理,有了脚本后使用命令更方便


http://www.ppmy.cn/ops/130424.html

相关文章

OpenAI推出搜索GPT,进军搜索引擎领域

OpenAI 推出了一项新功能——Search GPT&#xff0c;为 ChatGPT 引入实时网络搜索功能&#xff0c;使其站上与 Google 和 Bing 等搜索巨头竞争的舞台。 OpenAI 产品的重大变化&#xff0c;Search GPT 承诺提供快捷、实时的答案&#xff0c;并附上可靠来源的链接。 ChatGPT 一直…

「C/C++」C++11 之 std::pair单元存储的途径

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

Spring Boot JPA中的Page组件详解

1. 简介 在开发企业级应用时&#xff0c;分页查询是一个非常常见的需求。Spring Boot JPA提供了强大的分页功能&#xff0c;通过Page接口和Pageable接口&#xff0c;我们可以轻松实现灵活的分页查询。本文将详细介绍Page组件的使用方法及其核心特性。 2. 核心概念 2.1 Page接…

《化学试剂》

《化学试剂》主要报道化学试剂、精细化学品、专用化学品及相关领域的最新研究进展、理论知识、科研成果、技术经验、新产品的合成、分离、提纯以及各种分析测试技术、分析仪器、行业动态等&#xff0c;及时反映国内外的发展水平。 《化学试剂》投稿指南 目前《化学试剂》期刊已…

sklearn机器学习实战

1.PCA降维 不是每个数据特征对分析的问题都有用。即使有用&#xff0c;对问题的重要程度也不一样。而我们需要过滤和筛选一些特征&#xff0c;去除冗余。 数据降维是指采取某种映射方法&#xff0c;把高维空间中可能包含冗余信息和噪声的数据点映射到低维空间&#xff0c;在低…

Javaweb 实验4 xml

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验四 XML 目的&#xff1a; 安装和使用XML的开发环境认识XML的不同类型掌握XML文档的基本语法了解D…

【生物学&水族馆】观赏淡水鱼检测系统源码&数据集全套:改进yolo11-dysample

改进yolo11-SEAMHead等200全套创新点大全&#xff1a;观赏淡水鱼检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者…

Vue--单文件组件

前置学习&#xff1a;模块化 单文件组件&#xff1a;整个文件就是一个组件(.vue)&#xff0c;将组件导出 整体项目结构 school.vue <template><div>{{name}}</div> </template><script> export default {name:"school",data(){retu…