inotify запускает уведомление, когда запись запускается или когда это завершается?

Во-первых, обратите внимание, что Вам не нужен вызов к grep, между прочим: это может эффективно интегрироваться в awk звонить.

<logfile awk '/endQuery/ {print $3 " " $1}'

Можно отфильтровать запрещенные запросы на этапе awk. Сохраните продолжающиеся запросы в массиве, удалите их, если они запрещаются и только распечатывают незапрещенные.

<logfile awk '
    $2 == "startQuery" {q[$1]=1}        # store the names of active queries
    q[$1] && /banned/ {delete q[$1]}    # delete banned queries
    $2 == "endQuery" {
        if (q[$1]) print $3, $1;        # only report non-banned queries
        delete q[$1];
    }
' | sort -nr | head -n 3
12
12.07.2012, 18:57
1 ответ

Из того, что я вижу в источнике ядра, inotify действительно только разжигает после того, как запись завершается (т.е. Ваше предположение является неправильным). После того, как уведомление инициировано, еще только две вещи происходят в sys_write, функция, которая реализует write syscall: установка некоторых параметров планировщика и обновление позиции по дескриптору файла. Этот код еще был подобен 2.6.14. К этому времени огни уведомления файл уже имеет свой новый размер.

Проверьте на вещи, которые могут пойти не так, как надо:

  • Возможно, читатель получает старые уведомления от предыдущей записи.
  • Если читатель звонит stat и затем вызовы read или наоборот, что-то могло бы произойти промежуточное. Если Вы продолжаете добавлять в файл, звоня stat первые гарантии, что Вы сможете считать, что далеко, но возможно, что больше данных было записано к этому времени, читатель звонит read, даже если это еще не получило inotify уведомление.
  • Просто, потому что писатель звонит write не означает, что ядро запишет требуемое количество символов. Существует очень немного обстоятельств, где атомарные записи гарантируются до любого размера. Каждый write вызов гарантируется атомарный, однако: в какой-то момент данные еще не записаны, и затем внезапно n байты были записаны, где n является возвращаемым значением write звонить. Если Вы наблюдаете частично записанный файл, это означает это write возвращенные меньше, чем его аргумент размера.

Полезные инструменты для исследования, что продолжается, включают:

  • strace -tt
  • auditd подсистема
5
27.01.2020, 19:56
  • 1
    Спасибо за идеи. Я только что рассмотрел код, и я на самом деле только проверяю на-1 как возвращаемое значение от записи для ошибочного случая. Так, может случиться так, что я не получаю возвращаемое значение от записи, указывающей, что все данные были записаны. Тем не менее, когда я смотрю на файл после факта, я знаю, что все из эти "1000" байты были на самом деле записаны, потому что файл в хорошем состоянии, т.е. он состоит из целых, когерентных записей. Таким образом, первая запись частично не пишется. –  Todd Freed 12.07.2012, 17:36

Теги

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