免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 草中宝
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2010-09-30 09:31 |只看该作者
你既然修改这个文件自然知道哪个进程需要用到这个配置文件么,找到pid
kill -s signal pid 即可
davelv 发表于 2010-09-30 09:27



    如果用户只是知道修改配置文件,编程什么的不懂,不知道pid,那怎么办。。

论坛徽章:
0
22 [报告]
发表于 2010-09-30 09:33 |只看该作者
能修改配置文件的都是系统管理员吧.
能维护计算机服务难道还不会用命令嘛.

论坛徽章:
0
23 [报告]
发表于 2010-09-30 09:57 |只看该作者
inotify 应该就是lz 需要的。

详见 man 7 inotify
linyunxian 发表于 2010-09-27 22:30



    正确答案被无视了!!!!

论坛徽章:
0
24 [报告]
发表于 2010-09-30 10:09 |只看该作者
回复 23# jackin0627


    呵,lz 应该会采用这个。但普遍的现象是自己知道了就懒得去回应了。 只需要多一个回复就可以让其它路过的坛友节省一点自己的时间。

论坛徽章:
0
25 [报告]
发表于 2010-09-30 10:16 |只看该作者
正确答案被无视了!!!!
jackin0627 发表于 2010-09-30 09:57


man了一下,这个API很强大,学习...

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
26 [报告]
发表于 2010-10-13 11:09 |只看该作者
本帖最后由 yulihua49 于 2010-10-13 11:26 编辑
一个长期运行的Linux程序,想在不退出运行的情况下,通过某种机制,可以让程序知道参数已经改变,然后程序重 ...
草中宝 发表于 2010-09-27 19:08



    就是用kill,程序中用signal捕获信号,重读配置文件。
注意,发生信号时许多系统调用都会EINTR退出,注意处理。

inotify 很强大,但只linux有,UNIX不行。

论坛徽章:
0
27 [报告]
发表于 2010-10-13 11:23 |只看该作者
像Apache,mysql等大型应用程序,改配置的话需要重启程序的。何故呢?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
28 [报告]
发表于 2010-10-13 11:27 |只看该作者
像Apache,mysql等大型应用程序,改配置的话需要重启程序的。何故呢?
soforigoout 发表于 2010-10-13 11:23


但xinetd不用,kill -1 即可。

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

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

下面是我简单的测试例子

论坛徽章:
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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP