免费注册 查看新帖 |

Chinaunix

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

异常妖异的一个问题,再次验证了自己的浅薄,盼解答 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-23 17:23 |只看该作者 |倒序浏览
目前跟朋友做一个项目,使用crond来定时启动程序

前几天突然发现程序不能通过crond启动,用手动的方式却可以。

检查下来,发现程序启动时一处“fprintf(stderr, "Unexpected Message"”调用时出了问题

将这一行注释掉以后程序就可以通过crond定时启动起来。



开发环境:redhat linux7.2 内核2.4.7-10,c语言,libc-2.2.4

困扰很久了~~~

是不是通过crond调用的程序中所有指向stderr的输出都会被重定向到某个地方,从而导致……

论坛徽章:
0
2 [报告]
发表于 2005-12-23 17:41 |只看该作者
输出到日志文件试试

论坛徽章:
0
3 [报告]
发表于 2005-12-23 17:43 |只看该作者
试过了,输出到日志文件也木有问题

就是通过crond调用fprintf(stderr, ...)时出问题

虽然问题得到了暂时解决,但我想弄明白阿

努力思考ing!

论坛徽章:
0
4 [报告]
发表于 2005-12-23 18:49 |只看该作者
我的Linux里没有配置crond,不能查看它的具体行为
我怀疑是crond根本就关闭了0,1,2三个标准IO文件,建议用lsof看看

论坛徽章:
0
5 [报告]
发表于 2005-12-23 20:29 |只看该作者
试试将fprintf(stderr...)的返回值打出来看看.

论坛徽章:
0
6 [报告]
发表于 2005-12-23 23:46 |只看该作者
在HP-UX上看了下,cron的0,1,2分别被重定向到/dev/null,/var/adm/cron/log,/var/adm/cron/log,后者只对root可写

论坛徽章:
0
7 [报告]
发表于 2005-12-25 16:23 |只看该作者
谢谢楼上3位

我使用如下测试代码,分别在每次向stderr输出前后,在日志文件中进行标记,再用cron每隔一小时调用一次测试程序,结果只有调用fpriintf(stderr, ...)之前的打印信息,没有之后的


#include <stdio.h>
#include <time.h>
#include <string.h>

unsigned char * code =
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";

void write_to_error()
{
        int i;
        printf("code len = %d\n", strlen(code));
        for (i = 0; i < 10000; i ++)
        {
                fprintf(stderr, " --- %s  --- \n", code);
        }
}

void write_log(void)
{
        FILE *fd= NULL;
        char * dir="/mywork/log/test_log";

        fd = fopen(dir, "a+");

        if(fd == NULL)
        {
                return;
        }

        fprintf(fd, "%u --- begin --- \n", time(0));

        write_to_error();

        fprintf(fd, "%u --- end --- \n", time(0));

        fclose(fd);
}

int main()
{
        write_log();
        return 0;
}


总之,这个问题可能是由于cron重定向的位置不合理造成的,比如重定向到某个容量非常小的存储空间去。(不过这也让我很纳闷,最多是缓冲一下而已,也不应该引起进程退出阿)

再问一下6楼的兄弟:怎样察看cron将标准io重定向的规则呢?

[ 本帖最后由 dustman 于 2005-12-26 09:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2005-12-25 22:07 |只看该作者
会不会是收到什么信号而中止了?
把信号处理程序注册一下,在处理程序里打印一下看看呢。
怀疑是信号…………猜测而已。

论坛徽章:
0
9 [报告]
发表于 2005-12-25 22:09 |只看该作者
我猜测被crontab执行的程序都是不具有控制终端的,所以在执行你的程序中试图写控制终端的语句的时候就出错退出了.

论坛徽章:
0
10 [报告]
发表于 2005-12-26 12:39 |只看该作者
用lsof观察程序打开的文件描述符即可看到0,1,2重定向到何处
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP