linux 进程 守护进程,【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;

}

运行现象以及现象分析:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

当然,也有人认为,必须进行两次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;

}

运行结果:

0818b9ca8b590ca3270a3433284dd417.png

关于进程的目录,文件描述符等信息的查看,办法同上。

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

输入命令查看系统中的cron进程。

0818b9ca8b590ca3270a3433284dd417.png

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

根据cron的基本命令,也就是crontab,可以实现每隔一段时间向某个文件中写入相应的内容。

安装crontab,命令:

yum install crontabs

查看crontab文件中的内容:

0818b9ca8b590ca3270a3433284dd417.png

关于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进行查看:

0818b9ca8b590ca3270a3433284dd417.png

几分钟之后,查看hello.c文件:

0818b9ca8b590ca3270a3433284dd417.png

有时,我们希望将内容打印到终端上,所以…..(当时和同学讨论了很久,最后才是得出解决办法)

我们知道linux下一切皆文件,既然我们可以将内存写到普通文件,那为什么写不到终端上呢。

通过tty命令或者通过ttyname(fd)查看当前的终端.

0818b9ca8b590ca3270a3433284dd417.png

然后再次编写crontab文件。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

现象如下:

0818b9ca8b590ca3270a3433284dd417.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值