Принудительное ведение журнала stdout, stderr с отметкой времени

Если вы хотите соединить линии с одинаковым номером Ethernet и заменить :на ,, вы можете направить вывод в

awk -F: '
/ETHERNET/{ i = $1; v[i] = v[i] "," $2; if($3!="")v[i] = v[i] "," $3 }
END{  n = asorti(v,x)
      for(j=1;j<=n;j++){ i = x[j]; print i "=" substr(v[i],2) }
}'

Это разбивает каждую строку на :, использует первое поле ETHERNET0в качестве индекса в ассоциативный массив v, который собирает поля 2 и 3 (, если поле 3 не пусто ). В конце ввода ключи (индексы )массива сортируются, поэтому мы можем начать вывод с ETHERNET0, и для каждого ключа мы печатаем его и собранные поля, опуская первый символ, который всегда является лишняя запятая, так как мы всегда добавляем ее перед полем 2.

В результате, рассматривая каждую из ваших команд как независимые,:

ETHERNET0=64,2215,52,64,3969,701,702,2152,2154,4001

ETHERNET1=55,3971,51,53,55,3972,2151,2153,2155,4002

ETHERNET0=52,2152

ETHERNET0=54,4001,3968,52,54
ETHERNET1=3969,701,702,2152,2154,5569,4002,5001
0
01.01.2020, 14:43
1 ответ

Мир изобрел инструменты для этого еще в 1990-х годах. Нет необходимости изобретать их заново, плохо, в сценарии оболочки. Они дают вам строго ограниченный размер -, автоматический поворот, ротацию -по требованию -, временную метку -с именем, файлы журнала и временные метки в начале каждой строки вывода.

Временные метки строки не являются -параметром по умолчанию в multilog, s6-log, svlogdи tinylog, включаются параметром/аргументом строки команды -. cyclogбезоговорочно добавляет временные метки.

Временные метки TAI64N, добавленные некоторыми из этих инструментов, (как объяснено в https://unix.stackexchange.com/a/294276/5132), невосприимчивы к проблемам, связанным с часовыми поясами и изменениями летнего времени, легко обрабатываются машиной -и просто преобразуются в человеческие -читаемую форму фильтром tai64nlocal.

Адаптация записи таблицы cron Кусалананды:

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 | cyclog ~pi/log/crontab'

или:

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 | multilog t ~pi/log/crontab'

Существует меньший способ сделать это с помощью tai64nфильтра:

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 | tai64n >> ~pi/crontab.log'

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

Еще один способ перейти в 1990-е — запустить службу из диспетчера служб , которая занимается предотвращением множественных экземпляров, контекстом демона,и надлежащие механизмы управления, которые позволяют системному оператору останавливать/запускать службу во время выполнения; вместо использования cronи @reboot.

Некоторые менеджеры служб имеют механизмы определения служб, которые полностью устраняют любую необходимость в вашем launcher.shсценарии-оболочке и sudoпрочем. Вот модуль systemd (, демонстрирующий один тип определения службы ), преобразованный в пакет услуг nosh (, демонстрирующий другой вид):

% cat ProjectName.service
[Unit]
Description=https://unix.stackexchange.com/a/559920/5132
[Service]
User=pi
WorkingDirectory=/home/pi/%p
ExecStart=venv/bin/python main.py
[Install]
WantedBy=multi-user.target
% 
% system-control convert-systemd-units./ProjectName.service
% 
% system-control print-service-scripts./ProjectName
start:#!/bin/nosh
start:#Start file generated from./ProjectName.service
start:true
stop:#!/bin/nosh
stop:#Stop file generated from./ProjectName.service
stop:true
run:#!/bin/nosh
run:#Run file generated from./ProjectName.service
run:#https://unix.stackexchange.com/a/559920/5132
run:envuidgid --supplementary -- pi
run:userenv-fromenv
run:chdir /home/pi/ProjectName
run:setuidgid --supplementary -- pi
run:venv/bin/python main.py
restart:#!/bin/sh
restart:#Restart file generated from./ProjectName.service
restart:sleep 0.1
restart:exec false  # ignore script arguments
% 

Для управления службами nosh и daemontools -для управления службами семейства в целом также можно установить параллельныйcyclog@ProjectName(или какой-либо подобный )пакет службы для ведения журнала (, работающего cyclog, multilog., и другие. )и сообщает диспетчеру службы, что последняя является службой регистрации для первой.

Менеджеры служб, такие как nosh per-user-manager, systemd и Upstart, даже предоставляют пользователям механизмы для настройки, запуска и управления своими собственными непривилегированными службами.

Дополнительная литература

1
28.01.2020, 02:58

Теги

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