我在将 C printf 语句重定向到以 root 身份运行的程序的文件时遇到了麻烦。
我有一个程序,其中包含几个信息性 printf 语句和其他库,它们通过 stderr 打印错误。我想将这些错误记录到文件中。如果我从命令行启动该程序,我可以看到 stderr 和 stdout 消息。
sudo ./myprogram
如果我尝试像这样重定向,
sudo ./myprogram >> log_file 2>&1
log_file 仅包含 stderr,而 stdout 消失。
我怀疑该问题与 root 用户未连接到 stdout 有关,但我还没有找到解决方案。
我的最终目标是在系统启动时以 root 身份运行此程序,同时将 stderr 和 stdout 记录到 log_file。
我一直在使用 crontab 尝试此操作,
sudo crontab -e
并添加以下行,
@reboot bin/myprogram >> log_file 2>&1
这会生成 stderr 消息,但 stdout 消失,与命令行相同。
任何帮助都值得感激,谢谢!
编辑和更新:今天早上测试时,重定向行为与没有 sudo 时相同。典型的 printf 语句如下所示:
printf("info: passed safety check\n");
我在 ARM 处理器上使用 ubuntu 14.04 的默认设置,所以我相信我使用的是 bash。我确认过,
echo $SHELL
生产
/bin/bash
答案1
的行为
printf()
似乎取决于的位置stdout
。
- 如果
stdout
被发送到控制台,那么printf()
就会进行行缓冲,并且在打印换行符后刷新。- 如果
stdout
重定向到文件,则除非fflush()
调用,否则缓冲区不会被刷新。- 此外,如果在重定向到文件
printf()
之前使用stdout
,则后续写入(到文件)将进行行缓冲,并在换行符后刷新。
我对 C 编程不太熟悉,但显然你需要fflush(stdout);
在每个printf
语句后添加。从命令行尝试一下。如果有效,它应该可以与 cron 一起使用。
关于此主题的更多问题:
答案2
这TLDP 操作方法stdout
对于和的重定向有以下很好的语法stderr
:
@reboot /path/to/program &> /path/to/log
HowTo 说它有时适合 cron 条目。