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
,
- Если
stdout
отправляется на консоль, затемprintf()
буферизуется строкой и сбрасывается после печати новой строки.- Если
stdout
перенаправляется в файл, буфер не очищается, еслиfflush()
называется.- Более того, если
printf()
используется раньшеstdout
перенаправляется в файл, последующие записи (в файл) буферизуются строкой и сбрасываются после новой строки.
Источник: Почему stdout требует явной очистки при перенаправлении в файл?
Я не очень разбираюсь в программировании на C, но, видимо, вам нужно добавить fflush(stdout);
после каждого printf
заявление. Попробуйте это из командной строки. Если это работает, это должно работать с cron.
Еще вопросы по этой теме:
TLDP HowTo имеет этот приятный синтаксис для перенаправления обоих stdout
а также stderr
:
@reboot /path/to/program &> /path/to/log
В HowTo говорится, что иногда он подходит для записей cron.