【Linux】守护进程概述&cron守护进程实现定时任务

本文内容概述:
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
#include
#include
#include
#include
#include
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;
}

运行现象以及现象分析:
【Linux】守护进程概述&cron守护进程实现定时任务_第1张图片


【Linux】守护进程概述&cron守护进程实现定时任务_第2张图片


【Linux】守护进程概述&cron守护进程实现定时任务_第3张图片


【Linux】守护进程概述&cron守护进程实现定时任务_第4张图片


当然,也有人认为,必须进行两次fork进行创建守护进程,原因如下:
第一次fork(),保证调用setsid()创建守护进程的不是进程组组长(父进程才可能是进程组组长),所以,父进程退出,子进程来创建守护进程;
第二次fork(),保证当前的进程的ID与会话的ID不相等(也就是使得当前的进程不是会话组的话首进程),使得当前的进程无法打开新的控制终端。

代码实现:

#include
#include
#include
#include
#include
#include
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;
}

运行结果:
【Linux】守护进程概述&cron守护进程实现定时任务_第5张图片
关于进程的目录,文件描述符等信息的查看,办法同上。


cron守护进程(crond)实现定时任务:

输入命令查看系统中的cron进程。
【Linux】守护进程概述&cron守护进程实现定时任务_第6张图片

cron守护进程实现定时任务:
根据cron的基本命令,也就是crontab,可以实现每隔一段时间向某个文件中写入相应的内容。
安装crontab,命令:
yum install crontabs
查看crontab文件中的内容:
【Linux】守护进程概述&cron守护进程实现定时任务_第7张图片

关于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】守护进程概述&cron守护进程实现定时任务_第8张图片

有时,我们希望将内容打印到终端上,所以…..(当时和同学讨论了很久,最后才是得出解决办法)
我们知道linux下一切皆文件,既然我们可以将内存写到普通文件,那为什么写不到终端上呢。
通过tty命令或者通过ttyname(fd)查看当前的终端.
这里写图片描述

然后再次编写crontab文件。
这里写图片描述

这里写图片描述

现象如下:

【Linux】守护进程概述&cron守护进程实现定时任务_第9张图片

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

你可能感兴趣的:(linux,linux学习,linux,守护进程,cron进程,定时任务)