用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:
-
-
-
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <syslog.h>
- #include <dirent.h>
-
-
- #define NAME "AlarmInterface"
-
- #define RUN_NAME "DuiJiang &"
-
- #define READ_BUF_SIZE 100
-
-
-
-
-
-
- int daemon(int nochdir,int noclose)
- {
- pid_t pid;
-
-
- pid = fork();
-
- if (pid < 0)
- {
- perror("fork");
- return -1;
- }
-
- if (pid != 0)
- {
- exit(0);
- }
-
- pid = setsid();
- if (pid < -1)
- {
- perror("set sid");
- return -1;
- }
-
- if (!nochdir)
- {
- chdir("/");
- }
-
-
- if (!noclose)
- {
- int fd;
- fd = open("/dev/null",O_RDWR,0);
- if (fd != -1)
- {
- dup2(fd,STDIN_FILENO);
- dup2(fd,STDOUT_FILENO);
- dup2(fd,STDERR_FILENO);
- if (fd > 2)
- {
- close(fd);
- }
- }
- }
-
- umask(0027);
-
- return 0;
- }
-
-
- int judge_pid_exist(char* pidName)
- {
- DIR *dir;
- struct dirent *next;
-
- int i=0;
-
- FILE *status;
- char filename[READ_BUF_SIZE];
- char buffer[READ_BUF_SIZE];
- char name[READ_BUF_SIZE];
-
-
- dir = opendir("/proc");
- if (!dir)
- {
- printf("Cannot open /proc\n");
- return 0;
- }
-
-
- while ((next = readdir(dir)) != NULL)
- {
-
- if (strcmp(next->d_name, "..") == 0)
- {
- continue;
- }
-
-
- if (!isdigit(*next->d_name))
- {
- continue;
- }
-
-
- sprintf(filename, "/proc/%s/status", next->d_name);
- if (! (status = fopen(filename, "r")) )
- {
- continue;
- }
-
- if (fgets(buffer, READ_BUF_SIZE-1, status) == NULL)
- {
- fclose(status);
- continue;
- }
- fclose(status);
-
-
-
- sscanf(buffer, "%*s %s", name);
- if (strcmp(name, pidName) == 0)
- {
-
-
-
-
-
- return 1;
- }
- }
-
-
-
-
-
- return 0;
- }
-
- int main(int argc,char *argv[])
- {
- int fd = 0;
- char buf[100];
-
-
- daemon(0,0);
-
- while (1)
- {
-
-
-
-
- if (judge_pid_exist(NAME))
- {
-
-
- }
- else
- {
-
-
- system(RUN_NAME);
-
- }
-
-
- sleep(60);
- }
-
-
-
-
- return 0;
- }
分享到:
相关推荐
2. **检测程序是否运行**: 可以通过检查进程是否存在来判断目标程序是否运行。在Linux中,可以使用`system()`函数或者`popen()`来执行命令行操作,例如`pgrep`命令来查找指定的进程。 ```cpp #include #include ...
Linux守护进程是Linux系统中的一种特殊进程,它们在系统启动后独立运行,通常与用户的交互较少,负责执行长期持续的任务,如网络服务、系统监控、定时任务等。这些守护进程在后台持续工作,确保系统的正常运行和服务...
如果某个程序意外崩溃或被非正常终止,进程守护工具会自动检测到并重新启动该程序,保证服务的连续性。这在运行关键业务应用或服务的环境中是必不可少的。进程守护可能包含在系统服务中,或者可以通过第三方应用程序...
2. **java.nio.channels.FileLock**:Java新I/O(NIO)中的类,允许对文件进行加锁操作,用于检测某个文件是否正被另一个进程占用,从而判断程序状态。 3. **ProcessBuilder与Process**:这两个类允许Java程序调用...
守护进程的主要职责是在后台持续运行并监控某个应用程序或服务的状态,一旦检测到该应用程序出现异常退出的情况,守护进程能够自动重启它,从而确保关键业务的连续性和稳定性。 #### 关键概念解释 1. **批处理脚本...
本篇文章将深入探讨一个经典的Linux ARP解析程序的实现,包括守护进程的编写和ARP处理。 首先,我们需要了解ARP的工作原理。当主机需要向某个IP地址发送数据时,如果目标IP不在本地缓存中,主机就会广播一个ARP请求...
在Linux环境中,使用PHP进行程序运行状态的判断是常见的需求,尤其在自动化脚本和守护进程管理中。这里介绍的两种方法可以帮助我们有效地检查某个PHP程序是否已经在运行,避免资源的浪费和冲突。 方法一:利用Linux...
在Linux中,使用`cron`守护进程来调度计划任务。`cron`配置文件中的格式为“分钟 小时 日 月 周命令”。因此,要在每周日的下午四点十五分自动执行任务,应设置为`15 16 * * 0`。因此,正确答案是`d、15 16 0 * *`。...
对于守护进程而言,此信号可用于触发重新读取配置文件的操作。 - **默认行为**:终止进程。 - **示例**:`wget` 程序能够捕获并忽略此信号,从而实现即使用户退出登录也能继续下载的功能。 **2) SIGINT - 中断信号*...
- **启动服务**:根据`/etc/inittab`文件和`/etc/rc.d/rc目录中的脚本,`init`进程会启动各种服务,这些服务包括系统守护进程、网络服务等。 - **打开控制台**:系统会打开字符控制台(如tty1至tty6)和图形控制台...
6. **RedFlag HA Daemon (Service)**:HA守护进程,负责处理集群的核心功能,如心跳检测、故障切换等。 7. **RedFlag HA Monitor Daemon (Service)**:监控守护进程,用于实时监控系统状态。 8. **Agent Scripts**...
4. **性能分析**:监控程序运行时的文件访问,以了解程序的行为和优化潜在点。 5. **安全监控**:监视系统关键文件的变更,及时发现并处理异常活动。 综上所述,`inwatch` 是一个强大的工具,利用 inotify 机制...
在Linux系统中,遇到CPU使用率达到异常高的情况,如700%,这通常是由于某个或某些进程在执行过程中过度消耗CPU资源导致的。在这种情况下,解决问题的第一步是识别出问题进程,并尝试理解其行为和来源。 1. **定位...
当系统检测到某个应用程序崩溃时,`debuggerd`会自动启动并尝试捕捉崩溃时的信息,以便进行调试分析。这个过程通常包括保存崩溃时的内存快照、调用堆栈信息等数据。这对于定位问题根源、修复bug具有重要意义。 ####...
由于驱动程序运行在内核空间,其调试方法与用户空间的应用程序有所不同。本文旨在介绍如何在Linux内核中启用调试选项,并探讨几种常用的调试技术。 #### 二、在内核中开启调试选项 ##### 2.1 配置内核编译选项 ...
Init负责启动系统级别的服务,例如网络服务、日志记录、守护进程等。在System V init系统中,init会按照预定义的运行级别脚本执行任务。而在现代系统中,如Systemd,init系统更加模块化和并行化,提高了启动效率。...