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

Это генерирует сообщения stderr, но stdout исчезает, так же как и командная строка.

Любая помощь приветствуется, спасибо!

Изменения и обновления: тестируя это утро, перенаправление ведет себя так же без sudo. Типичный оператор printf выглядит так:

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

Я использую настройки по умолчанию для Ubuntu 14.04 на процессоре ARM, поэтому я считаю, что я использую Bash. Я подтвердил,

echo $SHELL

производит

/bin/bash

2 ответа

Решение

Поведение printf() кажется, зависит от местоположения stdout,

  1. Если stdout отправляется на консоль, затем printf() буферизуется строкой и сбрасывается после печати новой строки.
  2. Если stdout перенаправляется в файл, буфер не очищается, если fflush() называется.
  3. Более того, если printf() используется раньше stdout перенаправляется в файл, последующие записи (в файл) буферизуются строкой и сбрасываются после новой строки.

Источник: Почему stdout требует явной очистки при перенаправлении в файл?

Я не очень разбираюсь в программировании на C, но, видимо, вам нужно добавить fflush(stdout); после каждого printf заявление. Попробуйте это из командной строки. Если это работает, это должно работать с cron.

Еще вопросы по этой теме:

TLDP HowTo имеет этот приятный синтаксис для перенаправления обоих stdout а также stderr:

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

В HowTo говорится, что иногда он подходит для записей cron.

Другие вопросы по тегам