Вывод хранилища команды в кольцевой буфер

Linpus Linux является основанным на Fedora распределением Linux. Распределение является ядром Linux плюс связанное программное обеспечение, которое делает его обычно применимым (думайте файловый менеджер, интерфейс командной строки, установщик программного обеспечения и т.д.). Linpus был разработан для EA и предназначен конкретно для азиатского рынка.

Linux является ядром в основе всех дистрибутивов Linux т.е. программного обеспечения, которое находится между Вашим программным обеспечением и Вашими аппаратными средствами, позволяя двум связаться.

Если Вы задаете вопрос, возможности, Вы еще не на уровне для прокладывания себе путь от ядра и немногих людей, даже эксперты делают это так или иначе. Так, независимо от того, что может быть неправильным или прямо относительно Linpus, я пересек бы "Linux" от Вашего списка.

Дистрибутивы Linux, которые считают начальным уровнем и которые могут представлять интерес для Вас, включают Ubuntu, Linux Mint и Mageia и конечно некоторых других также.

16
07.12.2019, 00:35
5 ответов

Вы можете получить то, что хотите, через pipelog, который "позволяет вращать или очищать журнал проходящего процесса, пропуская его через промежуточное звено, которое реагирует на внешние сигналы", например:

spewstuff | pipelog spew.log -p /tmp/spewpipe.pid -x "gzip spew.log.1"

Затем вы можете получить pid из /tmp/ spewpipe.pid, и:

kill -s USR1 $(</tmp/spewpipe.pid)

Но это нужно будет настроить с помощью cron или что-то в этом роде. Однако, есть одна загвоздка. Обратите внимание I gzip spew.log.1 -- это потому, что команда -x выполняется после поворота лога. Таким образом, у вас есть еще одна проблема - перезаписывать spew.log.log.1.gz каждый раз, если только вы не напишете короткий сценарий для выполнения gzip и последующего перемещения файла, и не используете его в качестве команды -x.

Полное раскрытие: я написал это, так что, конечно, это работает отлично . ;). Я буду иметь в виду вариант компрессии, или что-нибудь, что лучше облегчит его, для версии 0.2 (предназначение -x несколько другое, но это будет работать, как описано выше). Также автоматический ролловер - хорошая идея... первая версия намеренно минимальна, так как я сопротивлялся искушению добавлять возможности, которые не были нужны (в конце концов, не так уж и сложно настроить для этого задание cron).

Обратите внимание, что оно предназначено для вывода text; если есть потенциальные нулевые байты, вы должны использовать -z -- который заменяет ноль на что-то другое. Это был компромисс для упрощения реализации.

.
6
27.01.2020, 19:49

Вот питоновый сценарий для взлома, чтобы сделать что-то подобное тому, что вы запрашиваете:

#!/bin/sh
''':'
exec python "$0" "$@"
'''

KEEP = 10
MAX_SIZE = 1024 # bytes
LOG_BASE_NAME = 'log'

from sys import stdin
from subprocess import call

log_num = 0
log_size = 0
log_name = LOG_BASE_NAME + '.' + str(log_num)
log_fh = open(log_name, 'w', 1)

while True:
        line = stdin.readline()
        if len(line) == 0:
                log_fh.close()
                call(['gzip', '-f', log_name])
                break
        log_fh.write(line)
        log_size += len(line)
        if log_size >= MAX_SIZE:
                log_fh.close()
                call(['gzip', '-f', log_name])
                if log_num < KEEP:
                        log_num += 1
                else:
                        log_num = 0
                log_size = 0
                log_name = LOG_BASE_NAME + '.' + str(log_num)
                log_fh = open(log_name, 'w', 1)
2
27.01.2020, 19:49

Лучшее, что я смог найти в аппроксимации, не связанной с написанием огромных кусков кода, это код zsh:

autoload zmv
mycmd |
  while head -c20M > mycmd.log && [ -s mycmd.log ]; do
    zmv -f '(mycmd.log)(|.(<->))(|.gz)(#qnOn)' '$1.$(($3+1))$4'
    {rm -f mycmd.log.1 mycmd.log.50.gz; (gzip&) > mycmd.log.1.gz} < mycmd.log.1
  done

Здесь разбиение и вращение максимум на 51 20MiB больших файлов.

2
27.01.2020, 19:49

multilog Дэна Бернштейна, по-видимому, может сделать это - или, возможно, большую часть, обеспечивая выход через файловые дескрипторы для ! Processor , чтобы компенсировать разницу, как вам нравится - хотя спецификации размера 20M / 1G могут потребовать некоторых изысканий, поскольку кажется, что 16M - это внешний предел для журнала. Далее следует, в большинстве случаев, выбор копирования + вставки из приведенной выше ссылки, хотя в ссылке также подробно описаны другие параметры, такие как отметка времени для каждой строки, поддержание другого файла [файлов], содержащего только самое последнее совпадение строк pattern и другие.

Интерфейс

 multilog script

... сценарий состоит из любого количества аргументов. Каждый аргумент определяет одно действие. Действия выполняются по порядку для каждой строки ввода.

Выбор строк

Изначально выбирается каждая строка. Действие ...

-pattern

... отменяет выделение строки, если шаблон соответствует строке. Действие ...

+pattern

выбирает строку, если шаблон соответствует строке.

... узор - это цепочка звезд и не звезд. Он соответствует любой конкатенации строк, соответствующих всем звездочкам и не звездочкам в одном и том же порядке. Не звезда соответствует себе. Звездочка перед концом шаблона соответствует любой строке, которая не включает следующий символ в шаблоне. Звездочка в конце шаблона соответствует любой строке.

Автоматически ротация журналов

Если каталог начинается с точки или косой черты, то действие ...

 dir

... добавляет каждую выбранную строку в журнал с именем dir . Если каталог не существует, его создает multilog .

Формат журнала следующий:

  1. dir - это каталог, содержащий некоторое количество старых файлов журнала, файл журнала с именем current и другие файлы для multilog ], чтобы отслеживать его действия.

  2. Каждый старый файл журнала имеет имя, начинающееся с @ , продолжающееся точной отметкой времени, показывающей, когда файл был завершен, и заканчивающееся одним из следующих кодов:

    • .s : Этот файл полностью обрабатывается и безопасно записывается на диск.
    • .u : этот файл создавался в момент сбоя. Возможно, он был усечен. Не обработано.

Действие ...

 ssize

... устанавливает максимальный размер файла для последующих действий dir . multilog решит, что current достаточно велико, если current имеет размер байт. ( multilog также решит, что current достаточно велик, если он видит новую строку в пределах 2000 байтов от максимального размера файла; он пытается завершить файлы журнала на границах строк.) Size должен быть между 4096 и 16777215. Максимальный размер файла по умолчанию - 99999.

В версиях 0.75 и выше: Если multilog получает сигнал ALRM , он немедленно определяет, что текущий достаточно велико, если current непусто.

(Примечание: я подозреваю, что встроенную функцию zsh schedule можно легко убедить отправить ALRM через определенные промежутки времени, если это необходимо.)

Действие ...

 nnum

... устанавливает количество файлов журнала для последующих действий dir . После переименования текущего , если multilog видит num или несколько старых файлов журнала, он удаляет старый файл журнала с наименьшей отметкой времени. число должно быть не менее 2. Количество файлов журнала по умолчанию - 10.

Действие ...

 !processor

... устанавливает процессор для последующих действий dir . multilog будет передавать текущий через процессор и сохранять вывод как старый файл журнала вместо текущего . multilog также сохранит любой вывод, который процессор записывает в дескриптор 5, и сделает этот вывод доступным для чтения в дескрипторе 4, когда он запускает процессор в следующем файле журнала. Для надежности процессор должен выйти из ненулевого значения, если у него есть какие-либо проблемы с созданием своего вывода; multilog запустит его снова. Обратите внимание, что работающий процессор может заблокировать любую программу, вводящую ввод в multilog .

4
27.01.2020, 19:49

В Linux с systemd, если у вас есть привилегии root, вы можете запустить выделенный экземпляр journald . Требуется LogNamespace=в юнит-файле

/etc/systemd/journald@myprogram.conf:

[Journal]
Storage=volatile
RuntimeMaxUse=20M

/etc/systemd/system/myprogram.service:

[Unit]
Description=My Test Service
[Service]
ExecStart=/home/myuser/myprogram
LogNamespace=myprogram
User=myuser

_

systemctl daemon-reload
systemctl start myprogram
journalctl --namespace=myprogram --follow

См.https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html#Journal%20Namespaces

0
13.11.2021, 06:48

Теги

Похожие вопросы