`
zljpp
  • 浏览: 259287 次
社区版块
存档分类
最新评论

用Linux守护进程检测某个程序是否运行2

阅读更多

用Linux守护进程检测某个程序是否运行2

 

 

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

 

主机:Fedora12

目标板:SC6410

目标板LINUX内核版本:2.6.36


说明:

第一版程序(参考http://blog.csdn.net/jdh99/article/details/7300641)已经可以正常工作,不过在运行一个月后发现有两台平板出现不能启动的问题,检查后发现是nand flash坏块很多,导致系统不能启动。究其原因,因该是对flash频繁的写操作造成的。上一版本的守护程序每分钟会写操作一次,这样一天的写操作就达千次。在这一版本中,判断需要守护的进程是否存在,是通过读取/proc/pid目录来判断的。参考链接:http://kb.cnblogs.com/a/2360817/


驱动源代码:

daemon_service.c:

 

  1. //守护进程,守护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. #include <dirent.h>  
  11.   
  12. //程序名字  
  13. #define NAME "AlarmInterface"  
  14. //要运行的程序  
  15. #define RUN_NAME "DuiJiang &"  
  16.   
  17. #define READ_BUF_SIZE 100  
  18.   
  19. //#define DIR_OUT_FILE "/rf/out"  
  20. //#define NAME "gnome-keyring"  
  21. //#define NAME_FIND "gnome"  
  22. //#define DIR_OUT_FILE "/root/test/out"  
  23.   
  24. int daemon(int nochdir,int noclose)  
  25. {  
  26.     pid_t pid;  
  27.   
  28.     //让init进程成为新产生进程的父进程  
  29.     pid = fork();  
  30.     //如果创建进程失败  
  31.     if (pid < 0)  
  32.     {  
  33.         perror("fork");  
  34.         return -1;  
  35.     }  
  36.     //父进程退出运行  
  37.     if (pid != 0)  
  38.     {  
  39.         exit(0);  
  40.     }  
  41.     //创建新的会话  
  42.     pid = setsid();  
  43.     if (pid < -1)  
  44.     {  
  45.         perror("set sid");  
  46.         return -1;  
  47.     }  
  48.     //更改当前工作目录,将工作目录修改成根目录  
  49.     if (!nochdir)  
  50.     {  
  51.         chdir("/");  
  52.     }  
  53.     //关闭文件描述符,并重定向标准输入,输出合错误输出  
  54.     //将标准输入输出重定向到空设备  
  55.     if (!noclose)  
  56.     {  
  57.         int fd;  
  58.         fd = open("/dev/null",O_RDWR,0);  
  59.         if (fd != -1)  
  60.         {  
  61.             dup2(fd,STDIN_FILENO);  
  62.             dup2(fd,STDOUT_FILENO);  
  63.             dup2(fd,STDERR_FILENO);  
  64.             if (fd > 2)  
  65.             {  
  66.                 close(fd);  
  67.             }  
  68.         }  
  69.     }  
  70.     //设置守护进程的文件权限创建掩码  
  71.     umask(0027);  
  72.   
  73.     return 0;  
  74. }  
  75.   
  76. //存在返回1,不存在返回0  
  77. int judge_pid_exist(char* pidName)  
  78. {  
  79.     DIR *dir;  
  80.         struct dirent *next;  
  81.         //long* pidList=NULL;  
  82.         int i=0;  
  83.   
  84.     FILE *status;  
  85.       char filename[READ_BUF_SIZE];  
  86.       char buffer[READ_BUF_SIZE];  
  87.       char name[READ_BUF_SIZE];  
  88.    
  89.       ///proc中包括当前的进程信息,读取该目录  
  90.         dir = opendir("/proc");  
  91.         if (!dir)  
  92.     {  
  93.         printf("Cannot open /proc\n");  
  94.         return 0;  
  95.     }  
  96.        
  97.         //遍历  
  98.         while ((next = readdir(dir)) != NULL)   
  99.     {  
  100.             /* Must skip ".." since that is outside /proc */  
  101.             if (strcmp(next->d_name, "..") == 0)  
  102.         {  
  103.                 continue;  
  104.         }  
  105.    
  106.             /* If it isn't a number, we don't want it */  
  107.             if (!isdigit(*next->d_name))  
  108.         {  
  109.                 continue;  
  110.         }  
  111.   
  112.                 //设置进程  
  113.             sprintf(filename, "/proc/%s/status", next->d_name);  
  114.             if (! (status = fopen(filename, "r")) )   
  115.         {  
  116.                 continue;  
  117.             }  
  118.   
  119.             if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)   
  120.         {  
  121.                 fclose(status);  
  122.                 continue;  
  123.             }  
  124.             fclose(status);  
  125.    
  126.                 //得到进程id  
  127.             /* Buffer should contain a string like "Name:   binary_name" */  
  128.             sscanf(buffer, "%*s %s", name);  
  129.             if (strcmp(name, pidName) == 0)   
  130.         {  
  131.                 //pidList=realloc( pidList, sizeof(long) * (i+2));  
  132.                 //pidList[i++]=strtol(next->d_name, NULL, 0);  
  133.   
  134.             //printf("hello,%s\n",next->d_name);  
  135.   
  136.             return 1;  
  137.             }  
  138.         }  
  139.    
  140.         //if (pidList)   
  141.     //{  
  142.             //pidList[i]=0;  
  143.         //}  
  144.         return 0;  
  145. }  
  146.   
  147. int main(int argc,char *argv[])  
  148. {  
  149.     int fd = 0;  
  150.     char buf[100];  
  151.   
  152.     //开启守护进程  
  153.     daemon(0,0);  
  154.   
  155.     while (1)  
  156.     {  
  157.         //打开日志  
  158.         //openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);  
  159.           
  160.         //判断是否有程序文件运行  
  161.         if (judge_pid_exist(NAME))  
  162.         {  
  163.             //syslog(LOG_INFO,"jdh success!!!!!!!!!!");  
  164.             //printf("hello,jdh,exist\n");    
  165.         }  
  166.         else  
  167.         {  
  168.             //syslog(LOG_INFO,"jdh fail!!!!!!!!!!");  
  169.             //运行程序  
  170.             system(RUN_NAME);  
  171.             //printf("hello,jdh,oh,no\n");  
  172.         }  
  173.           
  174.         //休眠  
  175.         sleep(60);  
  176.     }  
  177.   
  178.     //关闭日志  
  179.     //closelog();  
  180.   
  181.     return 0;  
  182. }  
分享到:
评论

相关推荐

    linux c++ 守护线程,判断程序是否运行,不存在就启动

    2. **检测程序是否运行**: 可以通过检查进程是否存在来判断目标程序是否运行。在Linux中,可以使用`system()`函数或者`popen()`来执行命令行操作,例如`pgrep`命令来查找指定的进程。 ```cpp #include #include ...

    LINUX守护进程介绍

    Linux守护进程是Linux系统中的一种特殊进程,它们在系统启动后独立运行,通常与用户的交互较少,负责执行长期持续的任务,如网络服务、系统监控、定时任务等。这些守护进程在后台持续工作,确保系统的正常运行和服务...

    自动重启+进程守护

    如果某个程序意外崩溃或被非正常终止,进程守护工具会自动检测到并重新启动该程序,保证服务的连续性。这在运行关键业务应用或服务的环境中是必不可少的。进程守护可能包含在系统服务中,或者可以通过第三方应用程序...

    Java实现Linux下双守护进程

    2. **java.nio.channels.FileLock**:Java新I/O(NIO)中的类,允许对文件进行加锁操作,用于检测某个文件是否正被另一个进程占用,从而判断程序状态。 3. **ProcessBuilder与Process**:这两个类允许Java程序调用...

    Windows使用bat批处理实现守护进程脚本分享

    守护进程的主要职责是在后台持续运行并监控某个应用程序或服务的状态,一旦检测到该应用程序出现异常退出的情况,守护进程能够自动重启它,从而确保关键业务的连续性和稳定性。 #### 关键概念解释 1. **批处理脚本...

    Linux 下一个ARP解析程序

    本篇文章将深入探讨一个经典的Linux ARP解析程序的实现,包括守护进程的编写和ARP处理。 首先,我们需要了解ARP的工作原理。当主机需要向某个IP地址发送数据时,如果目标IP不在本地缓存中,主机就会广播一个ARP请求...

    Linux中用PHP判断程序运行状态的2个方法

    在Linux环境中,使用PHP进行程序运行状态的判断是常见的需求,尤其在自动化脚本和守护进程管理中。这里介绍的两种方法可以帮助我们有效地检查某个PHP程序是否已经在运行,避免资源的浪费和冲突。 方法一:利用Linux...

    Linux自测题(正在学自Linux的朋友可以检测一下)

    在Linux中,使用`cron`守护进程来调度计划任务。`cron`配置文件中的格式为“分钟 小时 日 月 周命令”。因此,要在每周日的下午四点十五分自动执行任务,应设置为`15 16 * * 0`。因此,正确答案是`d、15 16 0 * *`。...

    linux信号详细列表

    对于守护进程而言,此信号可用于触发重新读取配置文件的操作。 - **默认行为**:终止进程。 - **示例**:`wget` 程序能够捕获并忽略此信号,从而实现即使用户退出登录也能继续下载的功能。 **2) SIGINT - 中断信号*...

    Linux启动流程 Linux启动流程

    - **启动服务**:根据`/etc/inittab`文件和`/etc/rc.d/rc目录中的脚本,`init`进程会启动各种服务,这些服务包括系统守护进程、网络服务等。 - **打开控制台**:系统会打开字符控制台(如tty1至tty6)和图形控制台...

    红旗linux redflag HA 双机 资料

    6. **RedFlag HA Daemon (Service)**:HA守护进程,负责处理集群的核心功能,如心跳检测、故障切换等。 7. **RedFlag HA Monitor Daemon (Service)**:监控守护进程,用于实时监控系统状态。 8. **Agent Scripts**...

    inwatch:用于设置 inotify 监视和对事件运行命令的守护进程

    4. **性能分析**:监控程序运行时的文件访问,以了解程序的行为和优化潜在点。 5. **安全监控**:监视系统关键文件的变更,及时发现并处理异常活动。 综上所述,`inwatch` 是一个强大的工具,利用 inotify 机制...

    Linux杀不死的进程之CPU使用率700%解决方法

    在Linux系统中,遇到CPU使用率达到异常高的情况,如700%,这通常是由于某个或某些进程在执行过程中过度消耗CPU资源导致的。在这种情况下,解决问题的第一步是识别出问题进程,并尝试理解其行为和来源。 1. **定位...

    framework学习笔记

    当系统检测到某个应用程序崩溃时,`debuggerd`会自动启动并尝试捕捉崩溃时的信息,以便进行调试分析。这个过程通常包括保存崩溃时的内存快照、调用堆栈信息等数据。这对于定位问题根源、修复bug具有重要意义。 ####...

    linux内核调试技术

    由于驱动程序运行在内核空间,其调试方法与用户空间的应用程序有所不同。本文旨在介绍如何在Linux内核中启用调试选项,并探讨几种常用的调试技术。 #### 二、在内核中开启调试选项 ##### 2.1 配置内核编译选项 ...

    Linux系统启动过程分析[参考].pdf

    Init负责启动系统级别的服务,例如网络服务、日志记录、守护进程等。在System V init系统中,init会按照预定义的运行级别脚本执行任务。而在现代系统中,如Systemd,init系统更加模块化和并行化,提高了启动效率。...

Global site tag (gtag.js) - Google Analytics