Если вы хотите соединить линии с одинаковым номером 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
Мир изобрел инструменты для этого еще в 1990-х годах. Нет необходимости изобретать их заново, плохо, в сценарии оболочки. Они дают вам строго ограниченный размер -, автоматический поворот, ротацию -по требованию -, временную метку -с именем, файлы журнала и временные метки в начале каждой строки вывода.
multilog
из daemontools , или Брюса Гюнтераmultilog
из daemontools -encore , или Адама Сэмпсона multilog
из freedts6-log
из s6svlogd
из рунитtinylog
от преступникаcyclog
из ношаВременные метки строки не являются -параметром по умолчанию в 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, даже предоставляют пользователям механизмы для настройки, запуска и управления своими собственными непривилегированными службами.