如何将子进程的输出重定向到syslog?

时间:2014-03-14 02:07:18

标签: c syslog

我在freebsd下用C开发。我使用cron job来调用程序A,它使用fork()/ exec()来调用另一个程序B.在A中,我使用syslog()将日志写入/ var / log / messages,但是B输出到stdout所以B&#39的输出没有写入/ var / log / messages。

如何在不修改B&#39的代码的情况下将B&#39的输出重定向到syslog?我想应该有一些机制将B&#39的输出重定向到A中的某个fd,但由于我使用syslog()而不是直接在A中打开文件,我不知道这是怎么回事会工作的。

感谢您的建议!

1 个答案:

答案 0 :(得分:1)

我不记得freebsd是否包含记录器程序。如果是这样,你的程序A可以调用B作为某种形式的“B | logger”。例如,而不是

execl("/my/path/to/B", "B", NULL);

利用shell:

execl("/bin/sh", "sh", "-c", "/my/path/to/B | logger", NULL);

logger 程序还有其他选项可将其消息定向到特定的syslog工具,这可能需要与A应用程序的行为相匹配。

缺少记录器,您可能需要进行传统的Posix管道拟合:使用 pipe(2)创建管道,将管道的输出侧复制到B的stdout,并读取(在A中或在单独的子进程中)管道的输入端,以便将消息发送到 syslog(3)

相关问题