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下, 父進程啟動的程序的生命期跟隨父進程, 父進程可以是終端, 父進程一旦終止, 子進程都必須結束. 因此守護進程需要脫離父進程,避免被父進程生命期控制