现在的位置: 首页 > 综合 > 正文

linux守护进程+自启动

2018年01月28日 ⁄ 综合 ⁄ 共 2303字 ⁄ 字号 评论关闭

linux守护进程+自启动

1.1 为进程添加守护进程

     #include <unistd.h> 
     #include <signal.h> 
     #include <sys/types.h> 
     #include <sys/stat.h> 
     #include <stdio.h> 
     #include <stdlib.h>
     #ifndef NOFILE 
     #define NOFILE 3 
    #endif
    void init_daemon() 
    { 
    int pid; 
    int i; 
    if(pid = fork()) exit(0); //父进程,退出   
    elseif(pid < 0) exit(1); //fork失败
     
    /* 子进程继续执行 */
    setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离 
    /* 防止子进程(组长)获取控制终端 */

    if(pid = fork()) exit(0); //父进程,退出 
    elseif(pid < 0) exit(1); //fork错误,退出 

    /* 第二子进程继续执行 , 第二子进程不再是会会话组组长*/
    //for(i = 0; i < NOFILE; i++) /* 关闭打开的文件描述符*/ 
    //{ 
    //close(i); 
    //} 
            chdir("/tmp"); /* 切换工作目录 */
            umask(0); /* 重设文件创建掩码 */
    return; 
    }

    int main(int argc, char* argv[])
    {    
        FILE *fp; 
       signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程 */
        init_daemon(); 
    while(1) 
        { 
               sleep(1);
    // 注意, 日志写到这个目录
    if((fp = fopen("/var/tmp/test.log", "a")) != NULL) 
                { 
                        fprintf(fp, "%s\n", "test message"); 
                        fclose(fp); 
                } 
        } 
    return 0;
    }

1.2 编写服务脚本
参考链接http://blog.sina.com.cn/s/blog_57421ff80100c7nn.html

     #!/bin/bash
     # chkconfig: 3 3 1
     # description: web kill center 
    EXEC_PATH=/usr/local/bin
     EXEC=CenterServiced
     PID_FILE=/var/run/CenterServiced.pid
     DAEMON=/usr/local/bin/CenterServiced
    if ! [ -x $EXEC_PATH/$EXEC ] ; then
    echo "ERROR: $EXEC_PATH/$EXEC not found"
    exit 1
    fi
    stop()
    {
    echo "Stoping $EXEC ..."
    killall $DAEMON >/dev/null
    echo "Shutting down $EXEC: [ OK ]"
    }
    start()
    {
    echo "Starting $EXEC ..."
    $DAEMON > /dev/null &
    echo "Starting $EXEC: [ OK ]"
    }
    restart()
    {
    stop
    start
    }
    case "$1"in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    status)
    status -p $PID_FILE $DAEMON
    ;;
    *)
    echo "Usage: service $EXEC {start|stop|restart|status}"
    exit 1
    esac
    exit $?

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

抱歉!评论已关闭.