Chinaunix

标题: 异常妖异的一个问题,再次验证了自己的浅薄,盼解答 [打印本页]

作者: dustman    时间: 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的输出都会被重定向到某个地方,从而导致……
作者: tena    时间: 2005-12-23 17:41
输出到日志文件试试
作者: dustman    时间: 2005-12-23 17:43
试过了,输出到日志文件也木有问题

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

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

努力思考ing!
作者: 4tar    时间: 2005-12-23 18:49
我的Linux里没有配置crond,不能查看它的具体行为
我怀疑是crond根本就关闭了0,1,2三个标准IO文件,建议用lsof看看
作者: zhhui2000    时间: 2005-12-23 20:29
试试将fprintf(stderr...)的返回值打出来看看.
作者: 4tar    时间: 2005-12-23 23:46
在HP-UX上看了下,cron的0,1,2分别被重定向到/dev/null,/var/adm/cron/log,/var/adm/cron/log,后者只对root可写
作者: dustman    时间: 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 编辑 ]
作者: mingyanguo    时间: 2005-12-25 22:07
会不会是收到什么信号而中止了?
把信号处理程序注册一下,在处理程序里打印一下看看呢。
怀疑是信号…………猜测而已。
作者: lifeixiao    时间: 2005-12-25 22:09
我猜测被crontab执行的程序都是不具有控制终端的,所以在执行你的程序中试图写控制终端的语句的时候就出错退出了.
作者: 4tar    时间: 2005-12-26 12:39
用lsof观察程序打开的文件描述符即可看到0,1,2重定向到何处
作者: dustman    时间: 2005-12-26 13:59
crond     1253 root  cwd       DIR    1,1    1024     14168 /var/spool/cron
crond     1253 root  rtd       DIR    1,1    1024         2 /
crond     1253 root  txt       REG    1,1   28200      2204 /usr/sbin/crond
crond     1253 root  mem       REG    1,1  107122      6004 /lib/ld-2.3.3.so
crond     1253 root  mem       REG    1,1 1345545      6147 /lib/tls/libc.so.6
crond     1253 root  mem       REG    1,1   41737      6025 /lib/libnss_files.so.2
crond     1253 root    0u      CHR    1,3              8125 /dev/null
crond     1253 root    1u      CHR    1,3              8125 /dev/null
crond     1253 root    2u      CHR    1,3              8125 /dev/null
crond     1253 root    3u      REG    1,1       5       144 /var/run/cron.pid


this is the output of "lsof |grep crond"

could you tell me what the meaning is?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2