Как Вы реализуете общие количества от вывода использования, сгенерированного программой в сценарии так, чтобы они продолжили нормально посредством повторного выполнения?

[115154]В Unix почтовая система является средством, с помощью которого системные уведомления доставляются пользователям. Вы можете думать об этом как о чем-то вроде Windows, где что-то будет показываться на панели задач с помощью всплывающего сообщения, если нужно что-то уведомить. Так как cronjobs (теоретически) не должен выдавать никаких результатов (так как никто не должен их видеть), любой результат (stdout или stderr) рассматривается как возможное указание на ошибку или проблему, и поэтому владельцу cronjob посылается электронное письмо с просьбой проверить его.[12184]Итак, все результаты (stdout и stderr) посылаются через локальную почтовую систему владельцу cronjob. Если владелец не является персональным аккаунтом, вы можете направить локальную MTA для пересылки на реальный почтовый аккаунт, установив псевдоним. Например, я добавил в [115827]/etc/aliases[115828]:[12185]Затем выполнил команду [115829]newaliases[115830] (для восстановления базы почтовых псевдонимов). После этого я начал получать корневые сообщения в корпоративный почтовый ящик:[12186]Так что это более или менее обычный способ (позволить системе отправлять уведомления по электронной почте). Есть и другие способы работы с уведомлениями. Несколько альтернатив:[12187]Изменение псевдонимов для сохранения писем в определённый файл:[12188]Отправка письма в скрипт:[12189]Альтернативой для изменения псевдонимов является использование [115832]MAILTO=[115833] опции внутри кронтаба пользователя, поддерживаемой многими демонами кронтаба. Это может быть предпочтительнее, если вы хотите получать только определенный набор пользовательских уведомлений, а не то, что упало в их почтовый ящик (что и делает [115834]псевдонимы[115835]).[12190]Я уверен, что есть много других, но вы, вероятно, захотите сделать первый или последний.[115171].
2
08.06.2014, 11:49
1 ответ

Что ж, судя по тому, что вы показываете, мне удалось разделить их довольно надежно, но с этими данными есть серьезная проблема: они ненормально . У вас здесь дружественные к человеку ценности - это нехорошо. Например, различия MB и GB между первой и последней строками - обработка, которая представляет собой много дополнительной работы, которую вам не нужно делать - почему бы и нет только байт считается? А что там с ([h]: [mm]) - почему оно в первой строке, а не в последней и почему не в Unix-времени?

Честно говоря, это не то данные, которые вы вообще должны регистрировать - это не очень полезно. Конечно, вам легче читать, но собираетесь ли вы прочитать 10 000 строк? Я думаю, вы бы этого не сделали, и поэтому вы задали этот вопрос. Вам нужно изменить этот вывод - не получать вообще никаких букв, только количество байтов и секунды с начала эпохи. Сделайте это, и вам будет много легче.

Итак, с учетом сказанного, вот что я сделал сделал:

set -- $(
sed '$bl;1H;d;:l;x;G
     s/([1-9][^)]*) //;h
     s/\n/First:&       /
     s/[^:]\(\n\)/&Last:\1      /
     w /dev/fd/2
     g' <<\DATA
1931255808 B 1.8 GB 3683.6 s (1:01 h) 524289 B/s 512.00 KB/s
2560401408 B 2.4 GB 4883.6 s (1:21 h) 524289 B/s 512.00 KB/s
3189547008 B 3.0 GB 6083.6 s (1:41 h) 524289 B/s 512.00 KB/s
3818692608 B 3.6 GB 7283.6 s (2:01 h) 524289 B/s 512.00 KB/s
4447838208 B 4.1 GB 8483.6 s (2:21 h) 524289 B/s 512.00 KB/s
10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s
DATA
)

Эта первая sed строка - это все, что нужно, чтобы получить только вашу первую и последнюю строки и поместить их в то же пространство шаблонов для редактирования sed , каждому из которых предшествует символ \ n ewline. Этот оператор делает все это:

$bl;1H;d;:l;x;G

Следующая строка очищает данные, которые являются частью проблемы, а затем сохраняет дополнительную копию результатов в h старом пространстве:

s/([1-9][^)]*) //;h

] В следующих трех строках перед соответствующими строками вставляются слова Первый: и Последний: затем \ n ewline и . и запишите результаты в stderr :

 s/\n/First:&       /
 s/[^:]\(\n\)/&Last:\1      /
 w /dev/fd/2

Последняя sed строка просто g и эта вторая копия из h старого пространства и перезаписывает текущее пространство шаблонов им, которое sed затем выполняет действие по умолчанию - печать последнего пространства шаблонов, за которым следует \ n ewline. По общему признанию, результаты на данный момент не такие впечатляющие. Выполнение приведенного выше фрагмента сценария приведет только к следующему:

First:
        1931255808 B 1.8 GB 3683.6 s 524289 B/s 512.00 KB/s
Last:
        10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s

Но я намеренно установил результаты в массив оболочки , а сохранил обе строки доступными в sed Пространство шаблонов неспроста. Например, следуя последней строке g в sed - при желании - вы можете работать с пространством шаблонов, которое выглядит следующим образом:

\n1931255808 B 1.8 GB 3683.6 s 524289 B/s 512.00 KB/s\n10829824 B 10.3 MB 20.65 s 524487 B/s 512.19 KB/s$ 

Или, если вы оставили его как есть и только добавил следующее к тому, что уже есть ...

printf '%s LINE, FIELDs 1 and 2: %s and %s' \
    FIRST "$1" "$2" LAST "${11}" "${12}"

Ваш вывод должен выглядеть так:

FIRST LINE, FIELDs 1 and 2: 1931255808 and B
LAST LINE, FIELDs 1 and 2: 10829824 and B

Это в дополнение к уже предоставленному stderr выводу.

1
27.01.2020, 22:22

Теги

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