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