Linux中用守护进程检测程序运行

来源:互联网 发布:windows phone8.1刷机 编辑:程序博客网 时间:2024/06/05 16:09

做的一个嵌入式板子开机会自启动一个程序,但发现它工作数天后会退出。检查内存使用并没有泄漏,于是编写了一个守护进程来不断检查程序是否运行,没运行则运行它,这是一个折衷的办法。


说明:

需要运行的程序是AlarmInterface,位于目录/rf/下面。我做了一个脚本DuiJiang来启动这个AlarmInterface,并在脚本中添加了触摸屏支持。也就是说启动DuiJiang就可以启动AlarmInterface。检测程序是否运行的方法是通过ps -w|grep AlarmInterface指令获得AlarmInterface的进程,然后保存在一个文件中.检查AlarmInterface进程是否运行即可判断程序是否运行.


驱动源代码:

daemon_service.c:

[cpp] view plain copy
  1. <span style="font-family:'Arial Black';font-size:18px;">//守护进程,守护AlarmInterface进程  
  2. //作者:jdh  
  3. //时间:2012-2-27  
  4. #include <stdio.h>  
  5. #include <unistd.h>  
  6. #include <sys/types.h>  
  7. #include <sys/stat.h>  
  8. #include <fcntl.h>  
  9. #include <syslog.h>  
  10.   
  11. //程序名字  
  12. #define NAME "AlarmInterface -qws"  
  13. //查找进程中程序名字  
  14. #define NAME_FIND "AlarmInterface"  
  15. //输出目录  
  16. #define DIR_OUT_FILE "/rf/out"  
  17. //要运行的程序  
  18. #define RUN_NAME "DuiJiang &"  
  19.   
  20. //#define DIR_OUT_FILE "/rf/out"  
  21. //#define NAME "gnome-keyring"  
  22. //#define NAME_FIND "gnome"  
  23. //#define DIR_OUT_FILE "/root/test/out"  
  24.   
  25. int daemon(int nochdir,int noclose)  
  26. {  
  27.     pid_t pid;  
  28.   
  29.     //让init进程成为新产生进程的父进程  
  30.     pid = fork();  
  31.     //如果创建进程失败  
  32.     if (pid < 0)  
  33.     {  
  34.         perror("fork");  
  35.         return -1;  
  36.     }  
  37.     //父进程退出运行  
  38.     if (pid != 0)  
  39.     {  
  40.         exit(0);  
  41.     }  
  42.     //创建新的会话  
  43.     pid = setsid();  
  44.     if (pid < -1)  
  45.     {  
  46.         perror("set sid");  
  47.         return -1;  
  48.     }  
  49.     //更改当前工作目录,将工作目录修改成根目录  
  50.     if (!nochdir)  
  51.     {  
  52.         chdir("/");  
  53.     }  
  54.     //关闭文件描述符,并重定向标准输入,输出合错误输出  
  55.     //将标准输入输出重定向到空设备  
  56.     if (!noclose)  
  57.     {  
  58.         int fd;  
  59.         fd = open("/dev/null",O_RDWR,0);  
  60.         if (fd != -1)  
  61.         {  
  62.             dup2(fd,STDIN_FILENO);  
  63.             dup2(fd,STDOUT_FILENO);  
  64.             dup2(fd,STDERR_FILENO);  
  65.             if (fd > 2)  
  66.             {  
  67.                 close(fd);  
  68.             }  
  69.         }  
  70.     }  
  71.     //设置守护进程的文件权限创建掩码  
  72.     umask(0027);  
  73.   
  74.     return 0;  
  75. }  
  76.   
  77. //是否有匹配的字符,有则返回1,没有返回0  
  78. //src:源字符串  
  79. //dst:目标字符串  
  80. //len:源字符串被比较的长度  
  81. int match(char *src,char *dst,int len)  
  82. {  
  83.     int i = 0;  
  84.     int j = 0;  
  85.     int size_dst = 0;  
  86.   
  87.     //获得目标字符串的长度  
  88.     size_dst = strlen(dst);  
  89.     //如果目标字符串的长度大于len,返回失败  
  90.     if (size_dst > len)  
  91.     {  
  92.         return 0;  
  93.     }     
  94.     //开始比较  
  95.     for (i = 0;i < len;i++)  
  96.     {  
  97.         for (j = 0;j < size_dst;j++)  
  98.         {  
  99.             if (src[i + j] != dst[j])  
  100.             {  
  101.                 break;  
  102.             }  
  103.         }  
  104.         if (j == size_dst)  
  105.         {  
  106.             return 1;  
  107.         }  
  108.     }  
  109.   
  110.     return 0;  
  111. }  
  112.   
  113. int main(int argc,char *argv[])  
  114. {  
  115.     int fd = 0;  
  116.     char buf[100];  
  117.   
  118.     //开启守护进程  
  119.     daemon(0,0);  
  120.   
  121.     while (1)  
  122.     {  
  123.         //打开日志  
  124.         openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);  
  125.           
  126.         //查看程序是否运行  
  127.         //新建输出文件  
  128.         system("touch "DIR_OUT_FILE);  
  129.         //获得程序ID  
  130.         system("ps -w|grep "NAME_FIND" >> "DIR_OUT_FILE);  
  131.         //打开输出文件  
  132.         fd = open(DIR_OUT_FILE,O_CREAT|O_RDONLY,0777);  
  133.         //清空缓存  
  134.         memset(buf,0,100);  
  135.         //读取全部  
  136.         read(fd,buf,100);  
  137.         //判断是否有程序文件运行  
  138.         if (match(buf,NAME,90))  
  139.         {  
  140.             syslog(LOG_INFO,"jdh success!!!!!!!!!!");  
  141.         }  
  142.         else  
  143.         {  
  144.             syslog(LOG_INFO,"jdh fail!!!!!!!!!!");  
  145.             //运行程序  
  146.             system(RUN_NAME);  
  147.         }  
  148.   
  149.         //休眠  
  150.         sleep(5);  
  151.         //删除输出文件  
  152.         system("rm "DIR_OUT_FILE);  
  153.           
  154.         //休眠  
  155.         sleep(55);  
  156.     }  
  157.   
  158.     //关闭日志  
  159.     closelog();  
  160.   
  161.     return 0;  
  162. }  
  163.   
  164. </span>  

守护进程每分钟检测一次,用tail -f /var/log/messages可以看到守护进程输出的信息.
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 滴滴快车出车祸怎么办 交警法院扣车怎么办 肇事逃逸没钱赔怎么办 撞死人无力赔偿怎么办 宝贝咳嗽很厉害怎么办 开车有人别车怎么办 判刑罚金交不起怎么办 罚金太多交不起怎么办 判决书上的罚金怎么办 刑事罚款不交怎么办 缎面的鞋脏了怎么办 夏天脸上长粉刺怎么办 鬃狮不吃东西怎么办 买二手车的车牌怎么办 榴莲打开了肉没熟怎么办 gmat的prep做完怎么办 电脑没ip地址怎么办 电脑ip地址缺失怎么办 cos还原不了人物怎么办 执行局抓人十五天不放人怎么办 笔记本电脑键盘按键错乱怎么办 靠墙倒立上不去怎么办 医院多收钱了怎么办 学生总是转笔怎么办 吃错东西呕吐怎么办 手腕筋扭伤了怎么办 右膝盖内侧疼痛怎么办 膝盖关节腔积液怎么办 小孩玩游戏花钱怎么办 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办