精华内容
下载资源
问答
  • Linux守护进程检测某个程序是否运行

    万次阅读 多人点赞 2012-02-28 09:05:10
    Linux守护进程检测某个程序是否运行 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 目标板:SC6410 目标板LINUX内核版本:2.6.36 实现功能: ...

    用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 <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <syslog.h>
    
    //程序名字
    #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可以看到守护进程输出的信息.



    展开全文
  • Linux守护进程检测某个程序是否运行2

    千次阅读 多人点赞 2012-04-24 13:33:17
    Linux守护进程检测某个程序是否运行2 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 目标板:SC6410 目标板LINUX内核版本:2.6.36 说明: ...

    用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:

    //守护进程,守护AlarmInterface进程
    //作者:jdh
    //时间:2012-4-27
    #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 1024
    
    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
    int judge_pid_exist(char* pidName)
    {
    	DIR *dir;
    	struct dirent *next;
    	int i = 0;
    
    	FILE *status;
    	char buffer[READ_BUF_SIZE];
    	char name[READ_BUF_SIZE];
     
    	///proc中包括当前的进程信息,读取该目录
    	dir = opendir("/proc");
    	if (!dir)
    	{
    		printf("Cannot open /proc\n");
    		return 0;
    	}
         
    	//遍历
    	while ((next = readdir(dir)) != NULL) 
    	{
    		//跳过"."和".."两个文件名
    		if ((strcmp(next->d_name, "..") == 0) || (strcmp(next->d_name, ".") == 0))
    		{
    			continue;
    		}
    
    		//如果文件名不是数字则跳过
    		if (!isdigit(*next->d_name))
    		{
    			continue;
    		}
    
    		//判断是否能打开状态文件
    		sprintf(buffer,"/proc/%s/status",next->d_name);
    		if (!(status = fopen(buffer,"r"))) 
    		{
    			continue;
    		}
    
    		//读取状态文件
    		if (fgets(buffer,READ_BUF_SIZE,status) == NULL) 
    		{
    			fclose(status);
    			continue;
    		}
    		fclose(status);
    
    		//读取PID对应的程序名,格式为Name:	程序名
    		sscanf(buffer,"%*s %s",name);
    		//判断程序名是否符合预期
    		if (strcmp(name,pidName) == 0) 
    		{
    			//符合
    			closedir(dir);
    
    			return 1;
    		}
        	}
     	
    	closedir(dir);
    
    	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);
    		
    		//判断是否有程序文件运行
    		if (judge_pid_exist(NAME))
    		{
    			syslog(LOG_INFO,"jdh success:)!!!!!!!!!!");
    			//printf("hello,jdh,exist\n");	
    		}
    		else
    		{
    			syslog(LOG_INFO,"jdh fail:(!!!!!!!!!!");
    			//运行程序
    			system(RUN_NAME);
    			//printf("hello,jdh,oh,no\n");
    		}
    		
    		//休眠
    		sleep(60);
    	}
    
    	//关闭日志
    	closelog();
    
    	return 0;
    }
    
    

    展开全文
  • 在我们做Linux开发的时候,往往会出现 某些库 can not found 的情况,在我们添加了这些库之后,如何查看这些库的路径是否被识别了呢?下面介绍一个命令: ldconfig -p | grep lts 说明:使用 ldconfig -p 命令...

    在我们做Linux开发的时候,往往会出现 某些库 can not found 的情况,在我们添加了这些库之后,如何查看这些库的路径是否被识别了呢?下面介绍一个命令:

    ldconfig -p | grep lts

    说明:使用 ldconfig -p 命令用来打印出当前缓存所保存的所有库的名字,然后用管道符传递给 grep lts 命令用于解析出 liblts.so 共享库的路径是否已加入缓存中。


    以下是ldconfig命令的解释和用法:http://blog.163.com/cn_prince/blog/static/638790120078289157270/

    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig  ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.

    ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.

    ldconfig命令行用法如下:

    ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...

    ldconfig可用的选项说明如下:

    (1) -v或--verbose : 用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字.

    (2) -n : 用此选项时,ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib,/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录.

    (3) -N : 此选项指示ldconfig不重建缓存文件(/etc/ld.so.cache).若未用-X选项,ldconfig照常更新文件的连接.

    (4) -X : 此选项指示ldconfig不更新文件的连接.若未用-N选项,则缓存文件正常更新.

    (5) -f CONF : 此选项指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf.

    (6) -C CACHE : 此选项指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表.

    (7) -r ROOT : 此选项改变应用程序的根目录为ROOT(是调用chroot函数实现的).选择此项时,系统默认的配置文件/etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf.如用-r /usr/zzz时,打开配置文件/etc/ld.so.conf时,实际打开的是/usr/zzz/etc/ld.so.conf文件.用此选项,可以大大增加动态链接库管理的灵活性.

    (8) -l : 通常情况下,ldconfig搜索动态链接库时将自动建立动态链接库的连接.选择此项时,将进入专家模式,需要手工设置连接.一般用户不用此项.

    (9) -p或--print-cache : 此选项指示ldconfig打印出当前缓存文件所保存的所有共享库的名字.

    (10) -c FORMAT 或 --format=FORMAT : 此选项用于指定缓存文件所使用的格式,共有三种:old(老格式),new(新格式)和compat(兼容格式,此为默认格式).

    (11) -V : 此选项打印出ldconfig的版本信息,而后退出.(12) -? 或 --help 或 --usage : 这三个选项作用相同,都是让ldconfig打印出其帮助信息,而后退出.


    展开全文
  • ps -ef |grep java|grep
  • 下面是在linux程序中如何查看一个网卡名是否存在的算法源码 #define PROCBUFSIZ 1024 #define _PATH_PROC_NET_DEV "/proc/net/dev" static char * interface_name_cut (char *buf, char **name) { char...

    下面是在linux程序中如何查看一个网卡名是否存在的算法源码


    #define PROCBUFSIZ                  1024
    #define _PATH_PROC_NET_DEV        "/proc/net/dev"
    static char * interface_name_cut (char *buf, char **name)
    {
      char *stat;
      /* Skip white space.  Line will include header spaces. */
      while (*buf == ' ')
        buf++;
      *name = buf;
      /* Cut interface name. */
      stat = strrchr (buf, ':');
      *stat++ = '\0';
      return stat;
    }
    
    int check_interface_fromproc(char *interface)
    {
      FILE *fp;
      char buf[PROCBUFSIZ];
      struct interface *ifp;
      char *name;
    
      /* Open /proc/net/dev. */
      fp = fopen (_PATH_PROC_NET_DEV, "r");
      if (fp == NULL)
        {   
            printf("open proc file error\n");
          return -1; 
        }   
    
      /* Drop header lines. */
      fgets (buf, PROCBUFSIZ, fp);
      fgets (buf, PROCBUFSIZ, fp);
    
      /* Only allocate interface structure.  Other jobs will be done in
         if_ioctl.c. */
      while (fgets (buf, PROCBUFSIZ, fp) != NULL)
        {   
          interface_name_cut (buf, &name);
          if(strcmp(interface,name)==0)
              return 1;
        }   
      fclose(fp);
      return 0;
    }





    算法也算比较漂亮,更重要的是学习其中的书写格式(代码中空格的使用方法)

    展开全文
  • linux c++ 守护线程,判断程序是否运行,不存在就启动
  • 用于检查文件(所有类型,包括目录类型)是否存在 -1:存在 0:不存在 如果不存在,可以用以下两种方式打印错误信息: 1)fprintf(stderr, "ERROR: %s\n", strerror(errno)); 2)perror("ERROR"); 程序代码...
  • linux 查看服务是否存在,是否启动

    千次阅读 2020-08-19 20:32:03
    文章目录linux常见服务列表:查看服务是否存在服务的概念:查看当前系统环境,是否存在指定的服务sudo service --status-all查看指定的服务是否已经运行service 服务名 statusps aux 如何查看当前系统支持的服务程序有...
  • Linux判断文件是否存在

    千次阅读 2020-10-04 14:06:27
    1,判断文件目录是否存在 #!/bin/bash path="/home/bai" if [ -d ${path} ];then echo ${path} exists! else echo ${path} not exists! fi 2,判断文件是否存在 #!/bin/bash file = "/home/bai.txt" if [ -f ${...
  • rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的...
  • linux下查找某个文件位置的方法

    万次阅读 2017-08-17 17:31:49
    1、**whereis 只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。 2、locate 命令和slocate命令都用来查找文件或目录。可以在使用locate之前,先使用updatedb...
  • 搭建Linux虚拟机并编写简单程序

    万次阅读 多人点赞 2019-05-28 18:25:43
    引言: 本篇文章基于教程目的,主要描述Linux的发展历程以及Linux虚拟机搭建、运行方式。...大多数服务器系统采用闭源形式或需要购买许可证,一般由官方团队维护,在特定情况下(比如需要系统增加某个硬...
  • #在Linux命令行中判断多个文件或目录是否存在 Linux命令行中判断多个文件或目录是否存在 制作一个小程序,实现查看文件/目录/文件路径是否存在,并且能 够同时判断多个。 Linux C语言程序 命令行输入 显示结果 ...
  • Linux判断进程是否存在并启动该进程

    万次阅读 2018-05-17 16:51:47
    转载来源于:http://ju.outofmemory.cn/entry/21163服务器上运行了一些...1.Linux判断进程是否存在并启动该进程#!/bin/bash #判断进程是否存在,如果不存在就启动它 PIDS=`ps -ef |grep myprocess |grep -v grep | ...
  • 查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs grep -ri "IBM" -l  1.正则表达式   (1)正则...
  • Linux驱动程序编写

    千次阅读 2011-08-27 13:10:20
    工作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程,深感技术交流的重要。Linux作为挑战微 软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出来,希望和大家...
  • 深入Linux设备驱动程序内核机制

    千次阅读 2012-02-21 20:24:16
    深入Linux设备驱动程序内核机制 陈学松 著 ISBN978-7-121-15052-4 2012年1月出版 定价:98.00元 16开 540页 内 容 简 介 这是一本系统阐述Linux设备驱动程序技术内幕的专业书籍,它的侧重点不是讨论如何在...
  • linux c语言判断文件是否存在

    千次阅读 2020-08-29 14:14:33
    检查调用进程是否可以对指定的文件执行某种操作。 用法: #include <unistd.h> #include <fcntl.h> int access(const char *pathname, int mode); 参数: pathname: 需要测试的文件路径名。 ...
  • Linux运行程序时,程序进程莫名退出(被杀死)

    千次阅读 多人点赞 2021-01-16 18:03:36
    1)Linux程序进程被杀,日志突然中止,可以考虑是否因为程序占用内存过高,导致系统内存不足,为避免系统崩溃,系统寻找内存占用最大的进程kill掉 2)也可能存在运行程序时没有使用nohup ( no hang up) command &...
  • 深入Java程序性能调优 深入浅出MongoDB应用实战集群及系统架构 深度揭秘服务器端内幕 电商网站之Solr应用 系统架构设计师 阿里分布式数据库服务实践 ————————————————————————...
  • 转自:http://www.cnblogs.com/zdz8207/p/3760891.htmllinux查看是否某个运行的进程命令:例如,查询是否包含 “my_post” 关键字的进程ps aux | grep my_postps aux | grep my_post | grep -v greproot 3682 0.0 ...
  • Linux后台运行程序最实用的两种方式

    千次阅读 多人点赞 2020-12-16 17:16:23
    Linux后台跑程序什么最好用?拒绝花里胡哨,运维大佬教你最实用的两招!快,快上车~
  • 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l   1.正则表达式 
  • Linux c判断文件是否存在

    千次阅读 2017-06-27 14:05:56
    转自:... 一、access函数 功能描述: 检查调用进程是否可以对指定的文件执行某种操作。 用法: #include #include int access(const char *pathname, int mode); 参数: pathname:
  • Linux网卡驱动程序编写

    千次阅读 2013-08-03 14:40:21
    Linux网卡驱动程序编写 工作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程,深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把...
  • linux查看某个pid的所有进程

    千次阅读 2019-11-28 11:29:13
    top -H -p $PID #查看对应进程的那个线程占用CPU过高 1、top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程。...这样可以查看所有存在的线程。 3、ps -mp 手册中说:m Show th...
  • linux 程序 进程 线程的关系

    万次阅读 2018-03-19 20:10:20
    启动程序,通常要运行某个文件,这个文件就是程序程序其实是存放在磁盘中的一个二进制文件。 进程 程序被触发后,执行者的权限与属性,程序程序代码与所需要的数据等都会被加载到内存中,操作系统给予这个...
  • Linux下C语言实现查看进程是否存在

    千次阅读 2013-01-07 14:03:35
    Linux下C语言实现查看进程是否存在 分类: Linux2012-02-21 11:21 987人阅读 评论(0) 收藏 举报 基本思路是先定义一个FILE指针,用该指针接收popen()执行ps指令的返回值,再从指针中读取数据到缓存,...
  • 编写一个脚本替代应用程序的运行,也就是通过启动脚本来启动程序,并监测程序是否挂掉,若挂掉则重新运行 #!/bin/sh while true do ps -ef | grep "$PWD/app/auto_run.sh" | grep -v "grep" ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 268,166
精华内容 107,266
关键字:

linux是否存在某个程序

linux 订阅