免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11620 | 回复: 36
打印 上一主题 下一主题

请教Linux下长期运行的程序怎么动态读取配置参数? [复制链接]

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-27 19:08 |只看该作者 |正序浏览
一个长期运行的Linux程序,想在不退出运行的情况下,通过某种机制,可以让程序知道参数已经改变,然后程序重新读取这个参数。千万别告诉我,程序定时的读取参数文件,然后把读取到的参数与旧参数做比较。

我想了下,是否可以用kill来传递参数,也不知道能否做到。或者做一个共享内存,主程序开一个线程,等待一个命名信号,传参数的副程序往这个共享内存写入参数,写入完毕以后,触发这个命名信号,然后主程序从这个共享内存读取新的参数。主程序和副程序也可以做到同一个程序中,不过需要加不同的参数控制。

请大家多多指教。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2010-11-17 08:58 |只看该作者
把程序的配置参数 加到 ldap 数据库里

论坛徽章:
0
36 [报告]
发表于 2010-11-16 12:16 |只看该作者
请问这个蛋疼的功能实现后有多大的好处吗?nginx改了配置文件好像还是得重启啊

论坛徽章:
0
35 [报告]
发表于 2010-11-16 12:05 |只看该作者
通常的做法是,设置HUP信号的处理函数,配置文件变更时,向进程发送HUP信号。
进程收到HUP信号,重新解析配 ...
zzyong08 发表于 2010-09-27 22:24



    这个是正解,好像nginx也是这么做的

论坛徽章:
0
34 [报告]
发表于 2010-11-16 00:31 |只看该作者
提示: 该帖被管理员或版主屏蔽

论坛徽章:
0
33 [报告]
发表于 2010-11-15 21:33 |只看该作者
简单的说,inotify适合被动的情况,signal适合主动的。。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
32 [报告]
发表于 2010-11-15 21:25 |只看该作者
个人感觉用信号稍微好点,灵活些,inotify更加合适作监控。

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
31 [报告]
发表于 2010-11-15 21:24 |只看该作者
其次是用信号的

    struct sigaction act;
    act.sa_handler = ouch;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGINT,&act,0);
    sigaction(SIGUSR1,&act,0);

void ouch(int sig)
{
    GlobalValueClass& globalValueClass = GlobalValueClass::Instance();

    if (sig==SIGINT)
    {
        //////
    }
    else if(sig==SIGUSR1)
    {
        //////
    }
    else
    {
        //////
    }
}

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
30 [报告]
发表于 2010-11-15 21:21 |只看该作者
首先是 inotify 的

#include <iostream>
#include <sys/inotify.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main(int argc , char *argv[])
{
    int fd;
    int wd;
    char buffer[BUF_LEN];
    int nLineCount=1;
    char pFileName[] = "abc.txt";

    fd = inotify_init();

    if ( fd < 0 )
    {
        perror( "inotify_init" );
    }

    //wd = inotify_add_watch( fd, "/home/hdc/Project/temp",IN_MODIFY | IN_CREATE | IN_DELETE );
    wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );

    while(true)
    {
        int length, i = 0;
        length = read( fd, buffer, BUF_LEN );

        if ( length < 0 )
        {
            perror( "read" );
        }

        printf( "[%d]\tlength=%d.\n",nLineCount++, length );

        while ( i < length )
        {
            struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];

            printf( "[%d]\tevent->len=%d\n",nLineCount++,event->len );

            if ( event->mask & IN_DELETE )
            {
                if ( event->mask & IN_ISDIR )
                {
                    if ( event->len )
                    {
                        printf( "[%d]\tThe directory %s was deleted.\n",nLineCount++, event->name );
                    }
                    else
                    {
                        printf( "[%d]\tThe directory was deleted.\n",nLineCount++ );
                    }
                }
                else
                {
                    if ( event->len )
                    {
                        printf( "[%d]\tThe file %s was deleted.\n",nLineCount++, event->name );
                    }
                    else
                    {
                        printf( "[%d]\tThe file was deleted.\n",nLineCount++ );
                    }
                }
            }
            else if ( event->mask & IN_MODIFY )
            {
                if ( event->mask & IN_ISDIR )
                {
                    if ( event->len )
                    {
                        printf( "[%d]\tThe directory %s was modified.\n",nLineCount++, event->name );
                    }
                    else
                    {
                        printf( "[%d]\tThe directory was modified.\n",nLineCount++ );
                    }
                }
                else
                {
                    if ( event->len )
                    {
                        printf( "[%d]\tThe file %s was modified.\n",nLineCount++, event->name );
                    }
                    else
                    {
                        printf( "[%d]\tThe file was modified.\n",nLineCount++ );
                    }
                }
            }

            else if ( event->mask & IN_DELETE_SELF)
            {
                if ( event->mask & IN_ISDIR )
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                }
                else
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                }
            }

            else if ( event->mask & IN_MOVE_SELF )
            {
                if ( event->mask & IN_ISDIR )
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                }
                else
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                    }
                }
            }

            else if ( event->mask & IN_IGNORED)
            {
                if ( event->mask & IN_ISDIR )
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                        wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                        wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );
                    }
                }
                else
                {
                    if ( event->len )
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                        wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );
                    }
                    else
                    {
                        printf( "[%d]\t%08X.\n",nLineCount++, event->mask );
                        //int nSleepedCount = sleep(1);
                        sleep(1);
                        wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );
                        while( wd == -1 )
                        {
                            wd = inotify_add_watch( fd, pFileName,IN_MODIFY | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_IGNORED );
                        }
                        //if( wd == -1 )
                        //{
                        //    printf( "[%d]\tignore inotify_add_watch fail.errno=%d,desc=%s.nSleepedCount=%d.\n",nLineCount++, errno, strerror(errno), nSleepedCount );
                        //}
                        //else
                        //{
                        //    printf( "[%d]\tignore inotify_add_watch success.errno=%d,desc=%s.nSleepedCount=%d.\n",nLineCount++, errno, strerror(errno), nSleepedCount );
                        //}
                    }
                }
            }

            i += EVENT_SIZE + event->len;
        }
    }

    ( void ) inotify_rm_watch( fd, wd );
    ( void ) close( fd );

    return 0;
}

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
29 [报告]
发表于 2010-11-15 21:20 |只看该作者
不好意思,没有想到我的问题,引来那么多大侠的回复。

其实inotify和信号都可以做到,用inotify的话,如果是用vi编辑参数文件,在捕捉到的事件中,需要做事件延迟或者简单循环,否则不能继续监听的。而且用inotify的话,有时候并不是参数发生了改变需要通知应用程序,而是需要按照上次的配置参数,再一次通知应用,这时候用inotify就不是很合适了。

下面是我简单的测试例子
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP