zoukankan      html  css  js  c++  java
  • 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下, 父进程启动的程序的生命期跟随父进程, 父进程可以是终端, 父进程一旦终止, 子进程都必须结束. 因此守护进程需要脱离父进程,避免被父进程生命期控制

  • 相关阅读:
    剑指offer--2.替换空格
    剑指offer--1.二维数组中的查找
    poj-1426-Find The Multiple(打表水过)
    hdoj-3791-二叉搜索树(二叉搜索树模板题)
    hdoj-1276-士兵队列训练问题(队列模拟)
    HihoCoder
    CodeForces-831A-Unimodal Array (水题)
    hdoj-1046-Gridland(规律题)
    hdoj-1038-Biker's Trip Odometer(水题)
    hdoj-1037-Keep on Truckin'(水题)
  • 原文地址:https://www.cnblogs.com/bigben0123/p/3090337.html
Copyright © 2011-2022 走看看