用Linux守护进程检测某个程序是否运行
2019-07-13 09:30发布
生成海报
用Linux守护进程检测某个程序是否运行
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:Fedora12
目标板:SC6410
目标板LINUX内核版本:2.6.36
实现功能:
做的一个嵌入式板子开机会自启动一个程序,但发现它工作数天后会退出。检查内存使用并没有泄漏,于是编写了一个守护进程来不断检查程序是否运行,没运行则运行它,这是一个折衷的办法。
说明:
需要运行的程序是AlarmInterface,位于目录/rf/下面。我做了一个脚本DuiJiang来启动这个AlarmInterface,并在脚本中添加了触摸屏支持。也就是说启动DuiJiang就可以启动AlarmInterface。检测程序是否运行的方法是通过ps -w|grep AlarmInterface指令获得AlarmInterface的进程,然后保存在一个文件中.检查AlarmInterface进程是否运行即可判断程序是否运行.
驱动源代码:
daemon_service.c:
//守护进程,守护AlarmInterface进程
//作者:jdh
//时间:2012-2-27
#include
#include
#include
#include
#include
#include
//程序名字
#define NAME "AlarmInterface -qws"
//查找进程中程序名字
#define NAME_FIND "AlarmInterface"
//输出目录
#define DIR_OUT_FILE "/rf/out"
//要运行的程序
#define RUN_NAME "DuiJiang &"
//#define DIR_OUT_FILE "/rf/out"
//#define NAME "gnome-keyring"
//#define NAME_FIND "gnome"
//#define DIR_OUT_FILE "/root/test/out"
int daemon(int nochdir,int noclose)
{
pid_t pid;
//让init进程成为新产生进程的父进程
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;
}
//是否有匹配的字符,有则返回1,没有返回0
//src:源字符串
//dst:目标字符串
//len:源字符串被比较的长度
int match(char *src,char *dst,int len)
{
int i = 0;
int j = 0;
int size_dst = 0;
//获得目标字符串的长度
size_dst = strlen(dst);
//如果目标字符串的长度大于len,返回失败
if (size_dst > len)
{
return 0;
}
//开始比较
for (i = 0;i < len;i++)
{
for (j = 0;j < size_dst;j++)
{
if (src[i + j] != dst[j])
{
break;
}
}
if (j == size_dst)
{
return 1;
}
}
return 0;
}
int main(int argc,char *argv[])
{
int fd = 0;
char buf[100];
//开启守护进程
daemon(0,0);
while (1)
{
//打开日志
openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER);
//查看程序是否运行
//新建输出文件
system("touch "DIR_OUT_FILE);
//获得程序ID
system("ps -w|grep "NAME_FIND" >> "DIR_OUT_FILE);
//打开输出文件
fd = open(DIR_OUT_FILE,O_CREAT|O_RDONLY,0777);
//清空缓存
memset(buf,0,100);
//读取全部
read(fd,buf,100);
//判断是否有程序文件运行
if (match(buf,NAME,90))
{
syslog(LOG_INFO,"jdh success!!!!!!!!!!");
}
else
{
syslog(LOG_INFO,"jdh fail!!!!!!!!!!");
//运行程序
system(RUN_NAME);
}
//休眠
sleep(5);
//删除输出文件
system("rm "DIR_OUT_FILE);
//休眠
sleep(55);
}
//关闭日志
closelog();
return 0;
}
守护进程每分钟检测一次,用tail -f /var/log/messages可以看到守护进程输出的信息.
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮