init, syslog и stdout / stderr

Я пытаюсь построить встроенную систему с linux. (Это очень мало ресурсов и не намного больше, чем busybox.) Я хотел бы убедиться, что все будет в syslog. Я использую новейшую версию busybox (v.1.21.1) со встроенным init и syslogd.

Однако есть несколько проблем. Сначала inittab:

.... null::sysinit:/bin/sh /etc/rc null::sysinit:/bin/touch /var/log/messages null::respawn:/sbin/syslogd -n -S -s 12 -b 8 null::respawn:/sbin/klogd -n .... 

Сценарий rc запускается до syslog, что означает, что вся полезная информация из rc теряется. (Я не уверен, что команда touch для btw.) Я могу запустить syslog до rc (null :: sysinit: / sbin / syslogd …), но это устранит очень важный «респаун».

Также, когда запускаются сторонние демоны, это может выглядеть так:

 ... null::respawn:/bin/modbus ... 

Если демон не поддерживает syslog или что-то выскальзывает (например, print to stderr), оно теряется. Я не могу перенаправить вывод в syslog. Например.

 ... console::respawn:/bin/modbus|logger 2>1 ... 

Я пробовал несколько разных комбинаций. Кажется, что ничего не работает. Ofc, я мог бы отредактировать всех демонов и заставить их поддерживать syslog. (Но что, если что-то выскальзывает?) Это можно решить, если бы я мог написать что-то вроде этого:

 log::respawn:/bin/modbus 

И на самом деле есть / dev / log. Но это сокет, нормальные переадресации не будут работать. … поэтому я мог бы заставить его работать через специальный модуль ядра. Например. Я мог бы создать модуль, который создает / dev / syslog_link, который записывает все в printk. Проблема в том, что syslog будет отмечать все сообщения от этого как «ядро». Очень неправильно.

Итак, теперь я думаю, что могу создать модуль ядра, который записывает в / dev / log: https://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-linux- модуль ядра https://www.cs.drexel.edu/~jjohnson/2012-13/fall/cs543/project/reading/kernel_fileio.pdf

Я не знаю, возможно ли это, хотя и писать файлы из пространства ядра вредит моему хрупкому состоянию правильного и неправильного.

Есть предположения?

  • Как отключить ведение журнала wpa_supplicant в syslog
  • syslog-ng не будет записывать в файл журнала - «Нет такого файла или каталога»
  • Почему abrt использует данные журнала для процесса, который не сработал?
  • Когда Linux отправляет корневую почту и как ее принудительно использовать для целей тестирования?
  • Ubuntu Server 16.04 - OpenVPN, похоже, не запускается, журналы не записываются
  • Как настроить файл syslog.conf для записи сообщений iptables в отдельный файл?
  • Отправлять журналы AIX local7 в отдельный файл
  • logrotate записывает старый app.log.1 вместо app.log
  • 2 Solutions collect form web for “init, syslog и stdout / stderr”

    Сценарий rc запускается до syslog

    Для этого может быть веская причина, например, потому что именно там файловая система, содержащая /var/log повторно монтируется rw. Если нет, вы можете сначала запустить syslog.

    Я пробовал несколько разных комбинаций. Кажется, что ничего не работает.

    Я не много играл с inittab более чем через несколько лет. Вы пытались положить, например, /bin/modbus|logger 2>1 в короткий скрипт, а затем использовать это вместо respawn ?

    Ofc, я мог бы отредактировать всех демонов и заставить их поддерживать syslog.

    Если возможно, вы, вероятно, должны это сделать. Или вы могли бы написать их напрямую в файл.

    есть / dev / log. Но это сокет, нормальные переадресации не будут работать. … поэтому я мог бы заставить его работать через специальный модуль ядра.

    Это похоже на перебор. Было бы проще использовать демон пользователя для пользователей и начать сначала; он может читать от fifo и писать на что угодно. Конечно, это может быть немного избыточным, поскольку уже существует syslog: / Трюк с читателем fifo заключается в повторном открытии канала, когда read() возвращает 0. Но опять же, я попытаюсь сначала запустить syslog. Сохранение стандартного материала кажется более простым.

    Вы можете рассмотреть / dev / kmsg, для ранних сообщений о запуске. Они будут храниться в круговом буфере в ядре до тех пор, пока пользовательское пространство (почти всех дистрибутивов) не выгрузит его в syslog после того, как файловая система станет доступной для записи, а проверки диска будут выполнены. Это будет работать до тех пор, пока ваш буфер ядра будет больше, чем размер сообщений, которые происходят до запуска регистратора. Размер буфера журнала ядра настраивается во время компиляции. Вы должны перенаправить вещи в / dev / kmsg с типичными сценариями оболочки.

    Что касается перенаправления stdout произвольных программ на syslog, там есть утилиты, которые читают STDIN и перенаправляют на syslog, а затем вы просто передаете выходные данные демона утилите. Вот что я нашел полезным: http://b0llix.net/perp/site.cgi?page=sissylog.8

    Все, что сказал, есть много людей, которые делают много умных вещей с протоколированием. Поскольку вам кажется, что вы заинтересованы в этом вопросе, вам может быть интересно ознакомиться с разделом «Проект syslog имеет недостатки в начале» от http://www.skarnet.org/software/s6/s6-log.html

    Надеюсь, это поможет.

    Linux и Unix - лучшая ОС в мире.