【Linux】守护进程概述&cron守护进程实现定时任务
来源:互联网 发布:零件加工报价软件 编辑:程序博客网 时间:2024/06/03 13:23
本文内容概述:
1.守护进程的概念,特点,以及创建守护进程的代码实现。
2.两次fork的原因。
3.利用cron进程实现定时向终端打印数据的任务。
守护进程的定义:
守护进程是一种生存期长的进程。通常在系统引导装入时启动,仅仅在系统关闭时终止。他们没有控制终端,所以,是在后台运行的。
守护进程的特点:
我们知道,打开系统,操作系统会通过0号进程去执行相应的操作;1号进程是init进程,也是系统的守护进程,它主要负责启动各运行层次特定的系统服务。
守护进程没有控制终端,不能直接和用户进行交互;不受登录注销的影响,只受开关机的影响。守护进程的命名都会以d结尾。
系统中有很多的守护进程,比如:
cron进程,完成特定的定时任务(下文我还会用cron);
kswapd进程,内存换页的守护进程。
flush进程,在可用内存达到最小阈值来冲洗磁盘。
创建守护进程的步骤:
(1)将文件模式的屏蔽字设置为0;
(2)fork出子进程,终止父进程(保证创建守护进程的进程不是进程组的组长);
(3)调用setsid创建一个新的会话;
(4)将当前工作目录改为根目录;
(5)关闭不需要的文件描述符;
(6)忽略SIGCHLD信号。
当然创建守护进程的另外一个办法就是直接调用库里的daemon()接口实现。下边的代码都是按照以上的6个步骤进行完成的。
代码实现:
#include<stdio.h>#include<unistd.h>#include<signal.h>#include<stdlib.h>#include<sys/stat.h>#include<sys/types.h>void myDaemond(){ umask(0); pid_t id = fork(); if(id < 0) { return ; } else if(id > 0) { exit(0); } int ret = setsid(); if(ret < 0) return; ret = chdir("/"); if(ret < 0) return; close(0); close(1); close(2); signal(SIGCHLD,SIG_IGN);}int main(){ myDaemond(); while(1) { sleep(1); } return 0;}
运行现象以及现象分析:
当然,也有人认为,必须进行两次fork进行创建守护进程,原因如下:
第一次fork(),保证调用setsid()创建守护进程的不是进程组组长(父进程才可能是进程组组长),所以,父进程退出,子进程来创建守护进程;
第二次fork(),保证当前的进程的ID与会话的ID不相等(也就是使得当前的进程不是会话组的话首进程),使得当前的进程无法打开新的控制终端。
代码实现:
#include<stdio.h>#include<unistd.h>#include<signal.h>#include<stdlib.h>#include<sys/stat.h>#include<sys/types.h>void myDaemond(){ umask(0); pid_t id = fork(); if(id < 0) { return ; } else if(id > 0) { exit(0); } int ret = setsid(); if(ret < 0) return; if(fork() > 0) { exit(0); } ret = chdir("/"); if(ret < 0) return; close(0); close(1); close(2); signal(SIGCHLD,SIG_IGN);}int main(){ myDaemond(); while(1) { sleep(1); } return 0;}
运行结果:
关于进程的目录,文件描述符等信息的查看,办法同上。
cron守护进程(crond)实现定时任务:
输入命令查看系统中的cron进程。
cron守护进程实现定时任务:
根据cron的基本命令,也就是crontab,可以实现每隔一段时间向某个文件中写入相应的内容。
安装crontab,命令:
yum install crontabs
查看crontab文件中的内容:
关于crontab的一些命令:
crontab -e:编辑crontab文件
crontab -r:删除crontab文件
crontab -l:列出crontab文件
crontab -u:指定某一用户的crontab文件
命令举例:
(1)每天的8点整向hello.c文件中写入内容“新的一天,加油~”
0 8 * * * peiyao echo > “新的一天,加油~”
(2)每一小时向hello.c文件中写入“该休息了~”
* /1 * * peiyao echo > “该休息了”
(3)每周六,周日的9点执行ls命令
* * * * 6,0 peiyao ls
(4)每天的12点到13点每隔30分钟执行一次 cat hello.c
/30 12-13 * * peiyao cat hello.c
实现效果:
通过crontab -e命令向crontab文件中写入以下的命令,通过crontab -l进行查看:
几分钟之后,查看hello.c文件:
有时,我们希望将内容打印到终端上,所以…..(当时和同学讨论了很久,最后才是得出解决办法)
我们知道linux下一切皆文件,既然我们可以将内存写到普通文件,那为什么写不到终端上呢。
通过tty命令或者通过ttyname(fd)查看当前的终端.
然后再次编写crontab文件。
现象如下:
这样,我们就可以实现一个简单的定时任务~~
- 【Linux】守护进程概述&cron守护进程实现定时任务
- cron守护进程
- Linux实现守护进程
- linux守护进程实现
- linux守护进程实现
- Linux守护进程实现
- linux守护进程实现
- 【Linux基础】守护进程概述
- Linux守护进程简单概述
- C实现Linux守护进程
- 守护进程:Linux实现转载
- linux 守护进程实现方法
- Linux 守护进程的实现
- Linux守护进程的实现
- 【Linux】守护进程以及实现一个守护进程
- Linux:守护进程解析、如何实现守护进程
- 守护进程的实现
- 守护进程实现
- 微信小程序之自定义轮播图实例 —— 微信小程序实战系列(3)
- Java中的参数传递方式
- 【OpenCV】笔记(8)——几何变换/修复/去噪
- vue.js树形组件详解,删除双击增加分支
- 算法 操作二叉查找树
- 【Linux】守护进程概述&cron守护进程实现定时任务
- AI与CV公司
- C++实验3
- web前端-在迷惘中的探索HTML5(二)本地存储之IndexDB
- Windbg在软件调试中的应用
- nodejs-fs模块
- 从零开始编译自己的 Linux 发行版
- jQuery使用说明
- Android深入--03-- 编译(诞生)