使用香橙派学习 Linux的守护进程

news2024/11/25 11:50:49

Q:什么是守护进程

A:Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的 守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器 mysqld,守护进程的名称通常以d结尾

守护进程的基本特点

  • 生存周期长(非必须),一般操作系统启动的时候就启动,关闭的时候关闭
  • 守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出
  • 守护进程是在后台运行,不会占着终端,终端可以执行其他命令
  • 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程

linux操作系统本身是有很多的守护进程在默默执行,维持着系统的日常活动。大概30-50个

输入“ps -elf”指令, 显示系统中所有进程的列表,包括其他用户的进程(-ef), 并用长格式显示(-l)

ps -aux 也可以显示这些进程,只不过显示的内容不大一样,比如-aux还会显示进程的状态,CPU和内存显示情况

 

其中:

  • ppid = 0:内核进程,跟随系统启动而启动,生命周期贯穿整个系统
  • cmd列名带“ [ ] ”这种,叫内核守护进程
  • 老祖init(就是CMD列第一个):也是系统守护进程,它负责启动各运行层次特定的系统服务;所以很多进程的PPID是init,也负责收养孤儿进程
  • cmd列中名字不带“ [ ] ”的这种,叫普通守护进程(用户集守护进程)

守护进程和后台进程的区别

  • 守护进程和终端不挂钩;后台进程能往终端上输出东西(和终端挂钩)
  • 守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出

Q:如何启动后台进程?

A: 可以选择在执行语句后加上“ &”(空格加&),意思是后台运行

守护进程的开发方式

使用damon函数结合两个C库的时间函数来实现一个“每隔10秒向/home/orangepi/daemon.log写入当前时间”的守护进程

damon()函数

#include <unistd.h>
int daemon(int nochdir, int noclose);
  • nochdir:为0时表示将当前目录更改至“/”
  • noclose:为0时表示将标准输入、标准输出、标准错误重定向至“/dev/null”
  • 返回值: 成功则返回0,失败返回-1 

C库函数——asctime()

char *asctime(const struct tm *timeptr)
  • 返回一个指向字符串的指针,它代表了结构 struct timeptr 的日期和时间 

C库函数——localtime()

struct tm *localtime(const time_t *timer) 
  • 使用 timer 的值来填充 tm 结构。 timer 的值被分解为 tm 结构,并用本地时区表示 
struct tm {
    int tm_sec; //秒,范围从 0 到 59
    int tm_min; //分,范围从 0 到 59
    int tm_hour; //小时,范围从 0 到 23
    int tm_mday; //一月中的第几天,范围从 1 到 31
    int tm_mon; //月份,范围从 0 到 11
    int tm_year; //自 1900 起的年数
    int tm_wday; //一周中的第几天,范围从 0 到 6
    int tm_yday; //一年中的第几天,范围从 0 到 365
    int tm_isdst; //夏令时
};

time_daemon.c:

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdbool.h>


static bool flag = true;

void handler(int sig)
{
	printf("I got a signal %d\nI'm quitting.\n", sig);
	flag = false; //当检测到退出信号时,将flag置为false,使得main中的while退出循环
}

int main()
{
	time_t t;
	int fd;
	//创建守护进程
	if(-1 == daemon(0, 0))
	{
		printf("daemon error\n");
		exit(1);
	}
	//设置信号处理函数
	//由于守护进程的标准输入、标准输出、标准错误都被重定向到了“/dev/null”,所以影响这个进程的方式只能是信号
	struct sigaction act; //这里选择使用sigaction函数,定义sigaction结构体
	act.sa_handler = handler; //但是却给sa_handler赋值而不是sa_sigaction,所以还是相当于使用了signal函数
	sigemptyset(&act.sa_mask); //将信号集清空
	act.sa_flags = 0;
	if(sigaction(SIGQUIT, &act, NULL)) //和上面所说一样,由于没有定义sa_sigaction,所以实现的效果就和signal函数一样,即收到“SIGQUIT”信号的时候执行handler函数
	{
		printf("sigaction error.\n");
		exit(0);
	}
	//进程工作内容
	while(flag)
	{
		fd = open("/home/orangepi/daemon.log", O_WRONLY | O_CREAT | O_APPEND,0644); //只写打开(O_WRONLY);文件不存在就创建(O_CREAT);每次写都加到文件的尾端(O_APPEND),主用户可读可写(6),其他用户只能读(4)
		if(fd == -1)
		{
			printf("open error\n");
		}
		t = time(0); //类似初始化
		char *buf = asctime(localtime(&t)); //localtime将t分解为tm结构,asctime将tm结构解析成时间的字符串
		write(fd, buf, strlen(buf));
		close(fd);
		sleep(10); //每隔10S写入一次
	}
	return 0;
}

实现效果:

编译并运行:

此时看起来什么都没有发生,但其实守护进程已经开始跑起来了,可以使用“ps -ef|grep a.out” 指令来验证:

可见,8412就是这个守护进程的PID号(8472是grep的,可以无视) 

同时"cd"到根目录下,并“ls”:

出现了这个“daemon.log”的文件

然后此时调用SIGQUIT来结束这个守护进程并验证:

成功退出!最后打开daemon.log

 

可见,时间信息确实不断的追加打印到了这个文件!并且,只要不调用SIGQUIT,哪怕关掉终端也不会结束运行,只有系统关闭才会关闭。

且守护进程一般是开机自启的,实现这一点可以通过“sudo vi /etc/rc.local”,然后添加守护进程的绝对路径来实现:

  • 注意,这里的路径应该是可执行文件的绝对路径,而不是C文件的绝对路径,所以需要再次编译一下C文件起一个名字
  • 且如果想在这个文件下写多个路径,直接分多行写就可以
  • 对于非守护进程,如果也想写入文件进行开机自启,可以选择在路径后加上“ &”(空格加&),意思是后台运行

保存退出后,执行“sudo reboot” 重新启动!

重新启动后,使用“ps -ef|grep time_daemon” 指令来查看是否开机自启:

可见,成功实现了开机自启!此时同样输入“sudo kill -3 2331” 来关闭这个守护进程,然后打开daemon.log

可见,在之前的基础上,又追加写入了很多次的时间信息! 

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

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

相关文章

MacOS如何降级旧版本?macOS降级,从 Ventura 13.0至Monterey 12

MacOS系统卡怎么办❓降级安装详细教程来了&#x1f495;&#xff0c;超详细的MacOS系统降级教程 如何使用Time Machine Backup&#xff08;时间机器备份&#xff09;降级macOS 如果您有备份&#xff0c;则此方法适合您。否则&#xff0c;您可以尝试下面提到的其他方法。 1.将…

Mybatis深度解析:从起源到现代应用的全景视角

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

web自动化测试 —— cypress测试框架

一、cypress简介 基于 JavaScript 的前端测试工具可以对浏览器中运行的任何内容进行快速、简单、可靠的测试对每一步操作都支持回看覆盖了测试金字塔模型的所有测试类型【界面测试&#xff0c;集成测试&#xff0c;单元测试】底层协议不采用 WebDriver > Cypress官网&#…

Apache shenyu,Java 微服务网关的首选

微服务网关的产生背景 当我们系统复杂度越来越高&#xff0c;团队协作效率越来越低时&#xff0c;我们通常会想到通过"拆分"来应对&#xff0c;这是典型的"化繁为简&#xff0c;分而治之"的思想。在落地过程中&#xff0c;我们通常会引入"SOA"或…

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求&#xff0c;从插件市场选了一个下载次数较多的组件引入到项目中uqrcode&#xff0c;使用步骤如下&#xff1a; 1、从插件市场下载 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id1287&#xff0c;若你是跟我一样是用uni-…

用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取

背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以&#xff0c;想通过php异步协程&#xff0c;发起爬取url请求控制python爬虫脚本&#xff0c;达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…

Cesium 生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

【FAQ】安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…

网络代理工具软件Proxyman mac中文版功能特点

Proxyman mac是一款网络代理工具软件&#xff0c;适用于Mac和iOS平台。它可以帮助开发人员、测试人员和网络管理员监控和调试网络流量。 Proxyman mac软件功能和特点 流量捕获和监控&#xff1a;Proxyman可以捕获并显示设备上的所有网络流量&#xff0c;包括HTTP、HTTps和WebSo…

Android之MediaCodec::PostAndAwaitResponse消息原理(四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

vscode自动添加文件和函数注释

自动添加注释 Doxygen Documentation Generator配置配置选项介绍配置文件头注释配置函数头注释 Doxygen Documentation Generator 此插件是vscode自动注释添加的插件&#xff0c;首先需要在vscode中查找并安装插件。如下图所示&#xff0c;插件在未安装的情况下会显示蓝色的In…

go-redis 框架基本使用

文章目录 redis使用场景下载框架和连接redis1. 安装go-redis2. 连接redis 字符串操作有序集合操作流水线事务1. 普通事务2. Watch redis使用场景 缓存系统&#xff0c;减轻主数据库&#xff08;MySQL&#xff09;的压力。计数场景&#xff0c;比如微博、抖音中的关注数和粉丝数…

【zotero】解决换新电脑后PDF打不开

关于zoteroPDF无法打开&#xff0c;并且提示&#xff1a;它可能已被移动或删除到 Zotero 之外&#xff0c;或者一台计算机上的链接附件基本目录可能设置不正确。 第一步&#xff1a;下载zutilo第二步&#xff1a;zutilo获取路径第三步 修改路径最后&#xff1a;新旧路径对比 第…

笔记1.6:计算机网络发展历史

1961-1972&#xff1a;早期分组交换原理的提出与应用 1972-1980&#xff1a;网络互连&#xff0c;大量新型、私有网络的涌现 1980-1990&#xff1a;新型网络协议与网络的激增 1999、2000‘s&#xff1a;商业化、Web、新应用 2005- &#xff1f; &#xff1a;

ChatGPT AIGC 完成各省份销售动态可视化分析

像这样的动态可视化由人工智能ChatGPT AIGC结合前端可视化技术就可以实现。 Prompt:请使用HTML,JS,Echarts 做一个可视化分析的案例,地图可视化,数据可以随机生成,请写出完整的代码 完整代码复制如下: <!DOCTYPE html> <html> <head><meta char…

汽油辛烷值的测定 马达法

声明 本文是学习GB-T 503-2016 汽油辛烷值的测定 马达法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 8 试剂和标准物 8.1 气缸夹套冷却液 若实验室所处海拔的水沸点为100℃1.5℃(212 F3F), 应使用水作为气缸夹套冷却液。当 实验室海拔高度不确定…

Android 滑动事件消费监控,Debug 环境下通用思路

Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中&#xff0c;经常会遇到滑动事件冲突。在一些简单的场景下&#xff0c;我们如果能够知道是那个 View 拦截了事件&#xff0c;那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…

「深度学习之优化算法」(十九)蚁狮算法

1. 蚁狮算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)    蚁狮是一种昆虫,城里长大的我没有见过这玩意儿,请教了农村长大小的伙伴,依然没见过,这玩意儿可能在我们生活的地方分布较少。 (图片及介绍来自百度百科)    蚁狮算法(Ant Lion Optimization…

自己动手写数据库:关系代数和查询树执行效率的推导

上几节我们完成了 sql 解释器的实现。通过解析 sql 语句&#xff0c;我们能知道 sql 语句想做什么&#xff0c;接下来就需要执行 sql 语句的意图&#xff0c;也就是从给定表中抽取所所需要的数据。要执行 sql 语句&#xff0c;我们需要了解所谓的“关系代数”&#xff0c;所谓代…

py基础语法

输出&#xff1a; print("wbshpnshp")输入&#xff1a; 1.raw_input() str raw_input("请输入&#xff1a;") print "你输入的内容是: ", str2.input(), input 可以接收一个Python表达式作为输入&#xff0c;并将运算结果返回。 str input(…