У меня есть большой проект, который я на самом деле уже завершил и работаю, но у него есть большой недостаток, и мне было интересно, у кого-нибудь были какие-либо идеи.
Итак, у меня есть записи в журнале, которые выглядят какthis:
Timestamp {PID A} Got Message
Timestamp {PID A} Message id: 56
Timestamp {PID A} Sent Message
Timestamp {PID B} Got Message
Timestamp {PID B} Message id: 56
Timestamp {PID B} Sent Message
Существует 7 разных PID, которые генерируют эти записи. Поэтому в дополнение к 3 нужным мне линиям я должен отслеживать, какой PID также сгенерировал запись.
Итак, в двух словах:
For PID in ${PID_ARRAY[@]}; do
Mapfile –O <where to start> –t GOT_ARRAY< <$(Journalctl –S [1 hour-ago] –U now | grep “PID” | grep “Got Message”)
COUNT[0]=$(Journalctl –S [1 hour-ago] –U now | grep “PID” | grep “Got Message” | wc –l)
<Increment the necessary variables>
done
Затем я делаю то же самоедля каждой нужной строки, ища «идентификатор сообщения» и «отправленное сообщение», за исключением чтения их в разные массивы. Затем я разрезаю эти массивы вверх на основе значений в массиве COUNT и получаю доступный для чтения и использования вывод.
Проблема в том, что, как grep для записей журнала, я не могу гарантировать, что сообщениеСтроки сообщения id и Sent находятся после строки Got message. Использование опции –S с journalctl позволит мне вернуться назад во времени, сколь угодно долго. Но что, если это закончится:
Timestamp {PID F} Sent Message
Timestamp {PID A} Got Message
Timestamp {PID A} Message id: 56
Timestamp {PID A} Sent Message
Timestamp {PID B} Got Message
Timestamp {PID B} Message id: 76
Timestamp {PID B} Sent Message
Тогда длина массива не будет совпадать, что действительно испортит мою нарезку.
Итак, мне нужен способ найти «Получил сообщение», а затем найти другие значения, после этого? Будет ли это делать? Это работает, просто в 1/6 раза происходит нечто подобное, - кто-нибудь знает?