一、功能介绍
Linux通过命令查找指定的进程是否存在,并返回该进程的PID号。
在程序中可以使用该方法监控指定的程序是否在运行,如果异常退出,可以重新启动指定程序或者系统。
#查找指定进程的PID find_name=s_app #s_app就是要查找的进程名称 pid_val=`ps -ef | grep $find_name | grep -v grep | awk '{print $2}'` if [ $pid_val > 0 ] then echo "查找的进程存在,对应的PID=${pid_val}" else echo "查找的进程不存在" fi
2.2 C语言代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> //查找指定的进程的PID号并返回 int find_pid(const char *app_name) { char cmd_buff[100]; int cnt; sprintf(cmd_buff,"ps -ef | grep %s | grep -v grep | awk '{print $2}'",app_name); FILE *fp=popen(cmd_buff,"r"); if(fp==NULL) { return -1; } cnt=fread(cmd_buff,1,sizeof(cmd_buff)-1,fp); cmd_buff[cnt]='\0'; pclose(fp); //判断是否读取到数据 if(cnt==0) { return 0; } return atoi(cmd_buff); } int main(int argc,char **argv) { int pid; //填入要查找的应用程序名称 pid=find_pid("s_app"); if(pid==-1) { printf("查找错误,查找程序未能启动.\n"); } else if(pid==0) { printf("查找的进程不存在.\n"); } else { printf("查找的进程PID=%d\n",pid); } return 0; }
三、检测指定程序是否存在,不存在就重新启动
#查找指定进程的PID find_name=s_app while : do pid_val=`ps -ef | grep $find_name | grep -v grep | awk '{print $2}'` if [ ${pid_val} > 0 ] then echo "查找的进程存在" else echo "查找的进程不存在" #重新启动 /mnt/hgfs/linux-share-dir/linux_c/s_app 8080 & fi sleep 10 done
为了方便启动该脚本,可以在执行程序里增加一行代码,将启动代码追加到系统启动文件里去:
grep -q "/home/wbyq/find_pid.sh &" /home/wbyq/.profile||echo "/home/wbyq/find_pid.sh &" >> /home/wbyq/.profile