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