Linux服务器守护进程+自动启动+服务配置笔记

Linux服务器守护进程+自动启动+服务配置笔记

1.1 为进程添加守护进程

参考链接http://yubosun.akcms.com/tech/linux-daemon-program.htm

   1:  #include <unistd.h> 
   2:  #include <signal.h> 
   3:  #include <sys/types.h> 
   4:  #include <sys/stat.h> 
   5:  #include <stdio.h> 
   6:  #include <stdlib.h>
   7:   
   8:  #ifndef NOFILE 
   9:  #define NOFILE 3 
  10:  #endif
  11:   
  12:  void init_daemon() 
  13:  { 
  14:          int pid; 
  15:          int i; 
  16:          if(pid = fork()) exit(0); //父进程,退出 
  17:   
  18:          else if(pid < 0) exit(1); //fork失败 
  19:   
  20:          /* 子进程继续执行 */ 
  21:          setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离 
  22:   
  23:          /* 防止子进程(组长)获取控制终端 */ 
  24:          if(pid = fork()) exit(0); //父进程,退出 
  25:   
  26:          else if(pid < 0) exit(1); //fork错误,退出 
  27:   
  28:          /* 第二子进程继续执行 , 第二子进程不再是会会话组组长*/ 
  29:   
  30:          //for(i = 0; i < NOFILE; i++) /* 关闭打开的文件描述符*/ 
  31:          //{ 
  32:          //close(i); 
  33:          //} 
  34:          chdir("/tmp"); /* 切换工作目录 */ 
  35:          umask(0); /* 重设文件创建掩码 */ 
  36:          return; 
  37:  }
  38:   
  39:  int main(int argc, char* argv[])
  40:  {    
  41:      FILE *fp; 
  42:   
  43:      signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程 */ 
  44:   
  45:      init_daemon(); 
  46:   
  47:      while(1) 
  48:      { 
  49:              sleep(1);
  50:              
  51:  // 注意, 日志写到这个目录
  52:              if((fp = fopen("/var/tmp/test.log", "a")) != NULL) 
  53:              { 
  54:                      fprintf(fp, "%s\n", "test message"); 
  55:                      fclose(fp); 
  56:              } 
  57:      } 
  58:   
  59:      return 0;
  60:  }

1.2 编写服务脚本

参考链接http://blog.sina.com.cn/s/blog_57421ff80100c7nn.html

红色字是需要填写的部分, 文件头部分可以选填

   1:  #!/bin/bash
   2:   
   3:  # chkconfig: 3 3 1
   4:   
   5:  # description: web kill center
   6:   
   7:  EXEC_PATH=/usr/local/bin
   8:   
   9:  EXEC=CenterServiced
  10:   
  11:  PID_FILE=/var/run/CenterServiced.pid
  12:   
  13:  DAEMON=/usr/local/bin/CenterServiced
  14:   
  15:  if ! [ -x $EXEC_PATH/$EXEC ] ; then
  16:   
  17:  echo "ERROR: $EXEC_PATH/$EXEC not found"
  18:   
  19:  exit 1
  20:   
  21:  fi
  22:   
  23:  stop()
  24:   
  25:  {
  26:   
  27:  echo "Stoping $EXEC ..."
  28:   
  29:  killall $DAEMON >/dev/null
  30:   
  31:  echo "Shutting down $EXEC: [ OK ]"
  32:   
  33:  }
  34:   
  35:  start()
  36:   
  37:  {
  38:   
  39:  echo "Starting $EXEC ..."
  40:   
  41:  $DAEMON > /dev/null &
  42:   
  43:  echo "Starting $EXEC: [ OK ]"
  44:   
  45:  }
  46:   
  47:  restart()
  48:   
  49:  {
  50:   
  51:  stop
  52:   
  53:  start
  54:   
  55:  }
  56:   
  57:  case "$1" in
  58:   
  59:  start)
  60:   
  61:  start
  62:   
  63:  ;;
  64:   
  65:  stop)
  66:   
  67:  stop
  68:   
  69:  ;;
  70:   
  71:  restart)
  72:   
  73:  restart
  74:   
  75:  ;;
  76:   
  77:  status)
  78:   
  79:  status -p $PID_FILE $DAEMON
  80:   
  81:  ;;
  82:   
  83:  *)
  84:   
  85:  echo "Usage: service $EXEC {start|stop|restart|status}"
  86:   
  87:  exit 1
  88:   
  89:  esac
  90:   
  91:  exit $?
  92:   

1.3 创建服务

参考链接http://hi.baidu.com/guanxiansun/blog/item/b4c7dcf55f6011e47709d724.html

将服务文件拷贝到/etc/init.d下,去掉扩展名, 文件名即是服务名

chmod +x ./wkcenter

如果不设置启动, 那么service中将无法找到该服务及操作

1.4 设置启动顺序

创建启动链接

ln /etc/init.d/wkcenter /etc/rc3.d/S03wkcenter

创建关闭链接

ln /etc/init.d/wkcenter /etc/rc0.d/K03wkcenter

1.5 添加服务

chkconfig --add wkcenter

查看服务是否存在

chkconfig –-list | grep wkcenter

查看服务状态

chkconfig wkcenter on

注意, 确认wkcenter在2,3,4,5中任意或者部分开启, 必须为绿字. 灰字代表服务无法开机启动或者其他问题

1.6 测试

临时开启命令测试

service wkcenter start

1.7 QA

参考链接: http://blog.526net.com/?p=1706

1. 服务切记不可放在用户home目录, 最好放在/usr/local/bin目录, 日志写到var中, 否则服务测试正常,但是无法自动启动

2. Linux下, 父进程启动的程序的生命期跟随父进程, 父进程可以是终端, 父进程一旦终止, 子进程都必须结束. 因此守护进程需要脱离父进程,避免被父进程生命期控制

你可能感兴趣的:(Linux服务器守护进程+自动启动+服务配置笔记)