博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux服务器守护进程+自动启动+服务配置笔记
阅读量:6256 次
发布时间:2019-06-22

本文共 3236 字,大约阅读时间需要 10 分钟。

转自: 

1.1 为进程添加守护进程

参考链接

1:  #include 
2:  #include 
3:  #include 
4:  #include 
5:  #include 
6:  #include 
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 编写服务脚本

参考链接

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

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 创建服务

参考链接

将服务文件拷贝到/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

参考链接: 

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

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

转载地址:http://wstsa.baihongyu.com/

你可能感兴趣的文章
IconFont 图标svg
查看>>
TFS实现需求工作项自动级联保存
查看>>
springmvc 4.x 处理json 数据时中文乱码
查看>>
nginx 重启命令
查看>>
一花一世界 一叶一菩提
查看>>
Python练习(day7)
查看>>
网络工程师笔试题总结
查看>>
我的友情链接
查看>>
C# DataTable的詳細用法
查看>>
vSphere网络原理及vSwitch
查看>>
df 命令
查看>>
jQuery 简介
查看>>
红帽新RHEL 7.1企业版发布
查看>>
Linux中的帮助功能
查看>>
Linux学习笔记——程序包管理之yum
查看>>
SqlServer转换为Mysql的一款工具推荐(mss2sql)
查看>>
go装饰模式,一个屌丝撸管的故事
查看>>
学习设计模式——命令模式
查看>>
【POJ】第一章 C/C++语言概述
查看>>
如何封装自己的js类库
查看>>