printf、重定向、crontab

printf、重定向、crontab

我在将 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

这会生成 std​​err 消息,但 stdout 消失,与命令行相同。

任何帮助都值得感激,谢谢!

编辑和更新:今天早上测试时,重定向行为与没有 sudo 时相同。典型的 printf 语句如下所示:

printf("info: passed safety check\n");

我在 ARM 处理器上使用 ubuntu 14.04 的默认设置,所以我相信我使用的是 bash。我确认过,

echo $SHELL

生产

/bin/bash

答案1

的行为printf()似乎取决于的位置 stdout

  1. 如果stdout被发送到控制台,那么printf()就会进行行缓冲,并且在打印换行符后刷新。
  2. 如果stdout重定向到文件,则除非fflush()调用,否则缓冲区不会被刷新。
  3. 此外,如果在重定向到文件printf()之前使用stdout,则后续写入(到文件)将进行行缓冲,并在换行符后刷新。

来源:为什么当重定向到文件时,stdout 需要显式刷新?

我对 C 编程不太熟悉,但显然你需要fflush(stdout);在每个printf语句后添加。从命令行尝试一下。如果有效,它应该可以与 cron 一起使用。

关于此主题的更多问题:

答案2

TLDP 操作方法stdout对于和的重定向有以下很好的语法stderr

  @reboot /path/to/program &> /path/to/log

HowTo 说它有时适合 cron 条目。

相关内容