写一个linux下写个关于c语言的双守护进程,就是监视一个进程,当其死掉,马上将其重启

写一个linux下写个关于c语言的双守护进程,就是监视一个进程,当其死掉,马上将其重启,第1张

可以分三步来做:

做两个简单的守护进程,并能正常运行

监控进程是否在运行

启动进程

综合起来就可以了,代码如下:

被监控进程thisisatest.c(来自http://www.cnblogs.com/ringwang/p/3528093.html):

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>

void init_daemon()

{

int pid

int i

pid=fork()

if(pid<0)  

  exit(1) //创建错误,退出

else if(pid>0) //父进程退出

  exit(0)

setsid()//使子进程成为组长

pid=fork()

if(pid>0)

  exit(0)//再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)  

  exit(1)

//关闭进程打开的文件句柄

for(i=0i<NOFILEi++)

  close(i)

chdir("/root/test") //改变目录

umask(0)//重设文件创建的掩码

return

}

void main()

{

  FILE *fp

  time_t t

  init_daemon()

  while(1)

  {

      sleep(60)//等待一分钟再写入

      fp=fopen("testfork2.log","a")

      if(fp>=0)

      {

          time(&t)

          fprintf(fp,"current time is:%s\n",asctime(localtime(&t))) //转换为本地时间输出

          fclose(fp)

      }

  }

  return

}

监控进程monitor.c:

#include<unistd.h>

#include<signal.h>

#include<stdio.h>

#include<stdlib.h>

#include<sys/param.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<time.h>

#include<sys/wait.h>

#include<fcntl.h>

#include<limits.h>

#define BUFSZ 150

void init_daemon()

{

int pid

int i

pid=fork()

if(pid<0)

  exit(1) //创建错误,退出

else if(pid>0) //父进程退出

  exit(0)

setsid()//使子进程成为组长

pid=fork()

if(pid>0)

  exit(0)//再次退出,使进程不是组长,这样进程就不会打开控制终端

else if(pid<0)

  exit(1)

//关闭进程打开的文件句柄

for(i=0i<NOFILEi++)

  close(i)

chdir("/root/test") //改变目录

umask(0)//重设文件创建的掩码

return

}

void err_quit(char *msg)

{

perror(msg)

exit(EXIT_FAILURE)

}

// 判断程序是否在运行

int does_service_work()

{

FILE* fp

int count

char buf[BUFSZ]

char command[150]

sprintf(command, "ps -ef | grep thisisatest | grep -v grep | wc -l" )

if((fp = popen(command,"r")) == NULL)

err_quit("popen")

if( (fgets(buf,BUFSZ,fp))!= NULL )

{

count = atoi(buf)

}

pclose(fp)

  return count

// exit(EXIT_SUCCESS)

}

void main()

{

  FILE *fp

  time_t t

  int count

  init_daemon()

  while(1)

  {

      sleep(10)//等待一分钟再写入

      fp=fopen("testfork3.log","a")

      if(fp>=0)

      {

          count = does_service_work()

          time(&t)

          if(count>0)

              fprintf(fp,"current time is:%s and the process exists, the count is %d\n",asctime(localtime(&t)), count) //转换为本地时间输出

          else

          {

              fprintf(fp,"current time is:%s and the process does not exist, restart it!\n",asctime(localtime(&t))) //转换为本地时间输出

              system("/home/user/daemon/thisisatest")//启动服务

          }

          fclose(fp)

      }

  }

  return

}

具体CMD命令:

cc thisisatest.c -o thisisatest

./thisisatest

cc monitor.c -o monitor

./monitor

tail -f testfork3.log   -- 查看日志

任何进程结束后都会关闭。守护进程是指脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,如果守护进程是非周期性的,只是执行一次后就推出,那么它一样会关闭。

许多人会把防止服务进程意外退出,周期性检查服务进程并自动重启已退出的进程的监控程序与守护进程的概念混淆,虽然大多数监控程序也被以守护进程的方式运行,但两者之间的概念是不同的。

你安装完was之后,是否添加了控制台?也就是DMGR,你运行的命令是启动控制台的

实在不行,可以把dmgr删了之后重新添加

删除节点:没啥重要的,所有的都删了

./manageprofiles.sh -deleteAll

删了profile之后,直接rm清一下文件夹

添加命令:进入到AppServer/bin下运行:

./manageprofiles.sh -create -profileNameDmgr1 -profilePath /opt/IBM/WebSphere/AppServer/profiles/Dmgr1 -templatePath /opt/IBM/WebSphere/AppServer/profileTemplates/management-hostName name1-enableAdminSecurity true -adminUserName admin -adminPassword admin

记得修改下命令中的hostname、username、password几个参数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7433705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存