曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3546|回复: 0
打印 上一主题 下一主题

在守护进程里定期执行任务

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-8-21 11:16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果想在守护进程里定期执行某个任务,一个较为直接的办法是利用 crontab 向守护进程发送信号。下面举例说明。

守护进程代码如下:
[C++] 纯文本查看 复制代码
#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/wait.h>
 
 #define  MAXFILE  65535
 
 static void sig_handler_usr(int sig)
 {
         int len, fd;
         char *buf = "This is a Daemon\n";
         len = strlen(buf);
 
         if(( fd = open("/tmp/dameon.log", O_CREAT|O_WRONLY|O_APPEND,0600)) < 0 ) {
             perror("open");
             exit(1);
         }
         write(fd, buf, len + 1);
         close(fd);
 }
 
 int main()
 {
     pid_t pc;
     int i;
     
     pc = fork();   
     
     if( pc < 0 ) {
         printf("error fork\n");
         exit(1);
     } else if ( pc > 0 )
         exit(0);    /*在父进程里,父进程退出*/
     
     setsid();
 
     chdir("/");
 
     umask(0);
     for( i = 0; i< MAXFILE; i++ )
         close(i);
 
     
     signal(SIGUSR1, sig_handler_usr);   //安装信号
   
     while(1) {
     sleep(10);
     }
 
 }

上面进程安装了一个 SIGUSR1 的信号处理函数。那么我们可以从 crontab 里设定一个定时任务,使其定时给守护进程发送信号,如 crontab 的内容如下:
22 23 * * * sh /root/signal.sh
上面定时在每晚的 23:22 这个时间里执行 signal.sh 这个脚本,在该脚本中获取守护进程 PID,然后向其发送信号,脚本内容如下:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh
 
 pid=`ps aux |grep '\.\/mydaemon' |awk '{print $2}'`
 
 kill -s 10  $pid
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-2 22:45 , Processed in 0.081467 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表