Linux 下简单监控进程

最近公司的一个项目由于有个进程运行不稳定,会出现意外退出的情况,于是便做了这么个小玩意!

本人第一次写些东西,难免生疏! 以后 还请大家多帮助!

希望对有需要的朋友有点作用.

代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/wait.h>

#include <sys/param.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <signal.h>

#define TMP_FILE “/tmp/proc.log”

#define VALID_NAME “vtserver”

#define PROCBUF 30

#define COMMONLEN 256

#define FILEBUF 256

#define ONE_MICRO_SECOND (1000)

#define ONE_SECOND (1000 * ONE_MICRO_SECOND)

#define PROCINVALID -1

#define PROCEXIST 0

#define PROCNOEXIST 1

int checkbyname(const char* name); //Accoriding to the process of checking the existence of Name

void init_daemon(void);

void valid(char *str);

//做得很简单,没有进行参数,返回值检查,要监控的进程也写死了

int main()

{

char* name = NULL;

int result = 0;

name = VALID_NAME;

init_daemon(); //弄成守护进程

while(1)

{

usleep(1000 * ONE_MICRO_SECOND); //1000ms,休息1秒

result = checkbyname(name);

if (result == PROCNOEXIST) //该进程不存在

{

pid_tpid;

pid= fork();

switch(pid)

{

case 0:

if (-1 == execl(“/usr/local/DoubleS/bin/vtserver”,”vtserver”,0))

printf(“Failed!/n”);

break;

default:

{

int stat_val;

pid_t child_pid;

child_pid = wait(&stat_val); //父进程等待子进程结束

}break;

}

}else

{

}

}

exit(0);

}

int checkbyname(const char* name) //假设fopen 一定是可以的

{

int readsize = 0;

FILE* file = NULL;

char command[COMMONLEN] = {‘/0’};

char buf[FILEBUF] = {‘/0’};

if (!name || strlen(name) <= 0)

return PROCINVALID;

sprintf(command,”ps -Al | grep %s > /tmp/proc.log”,name);

system(command);

file = fopen(TMP_FILE,”r”); //其实这里可以利用管道实现,但我不知道哪个效率高些

if (file)

{

readsize = fread(buf,sizeof(buf),1,file);

fseek(file,0,SEEK_END);

readsize = ftell(file);

fclose(file);

}

if (readsize != 0)

return PROCEXIST;

else

return PROCNOEXIST;

}

void init_daemon(void)

{

pid_t pid;

int i = 0;

if (pid = fork()) //pid > 0 就为父进程

exit(0);

else if (pid < 0) //pid < 0 失败了

exit(1); //fork failed

setsid(); //脱离父进程的会话,自己(第一个子进程)成为会话组长

if (pid = fork())

exit(0); //第一个子进程退出

else if (pid < 0)

exit(1); //fork failed

//这里是第二个子进程,即为第一个子进程创建的子进程

//关闭标准输入,输出,错误输出文件描述符

close(0);

close(1);

close(2);

chdir(“/”); //更改目录

umask(0); //重新设置文件掩码,我这里放的很松! 什么权限都有, 本人,组,其他人 都有读写执行的权限

return;

}

人生重要的不是所站的位置,而是所朝的方向

Linux 下简单监控进程

相关文章:

你感兴趣的文章:

标签云: