使用C程序不会获得预期的错误输出

时间:2015-04-07 08:53:23

标签: c linux bash sh

我有一个由cron任务调用的小脚本,它只启动一个程序并将标准输出重定向到一个文件中,错误输出重定向到另一个。问题是它适用于标准输出,但不适用于错误输出。

这是我的剧本:

#/bin/bash

echo "---------------------------------------------" \
     >> /usr/src/parser_mail/bin/log/log
echo "Parsing du " `date` >> /usr/src/parser_mail/bin/log/log
echo "---------------------------------------------" \
     >> /usr/src/parser_mail/bin/log/log
/usr/src/parser_mail/bin/parser \
     >> /usr/src/parser_mail/bin/log/log \
     2>> /usr/src/parser_mail/bin/log/error

经过几次测试后,我的解析器不会发出任何错误......

代码:

if (mysql_query(conn, sql))
{
    fprintf(stderr, "\n#################################################\n");
    fprintf(stderr, "ERREUR : %s\nInscription annulee pour cette horaire.\n",
        mysql_error(conn));
    fprintf(stderr, "#################################################\n");
}
else
{
    printf("*");fflush(stdout);
}

我可以在日志中看到" *"没有打印。所以它应该在错误输出上打印一些东西。

1 个答案:

答案 0 :(得分:1)

要做的第一件事就是摆脱我们在问题中可以看到的东西,这是你真正的解析器。

暂时更改您的命令:

/usr/src/parser_mail/bin/parser

为:

( echo xyzzy_output ; echo xyzzy_error >&2 )

并将重定向留在最后。您应该看到两行进入两个单独的文件。


如果他们这样做,那么您的解析器可能不会表现自己,例如不向stderr发送任何内容,或者将两个句柄混合在一起,以便它们转到同一个地方 之前你的重定向开始了。

在这种情况下,您可能希望从命令行运行解析器,例如:

/usr/src/parser_mail/bin/parser >xyzzy_out 2>xyzzy_err

并查看每个文件中显示的内容。例如,解析器可能发送任何内容到stderr


如果您没有获得两个文件输出正确,那么您需要查看其他可能性,例如权限,或者在您不知情的情况下围绕删除文件的疯狂进程: - )