【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文件。
这里写图片描述

这里写图片描述

现象如下:

这里写图片描述

这样,我们就可以实现一个简单的定时任务~~

1 0
原创粉丝点击