Заставить процесс игнорировать / отбрасывать накопленный вход во время приостановки?

Таким образом, у меня открыт открытый туннель SSH, и я использую tail для вывода вывода журнала sshd в awk для обнаружения определенных событий входа и запуска действия. Это выглядит так:

 ssh -NR 2222:127.0.0.1:22 server & tail -fn 0 /var/log/auth.log | \ awk '/Invalid user [az]+ from 127.0.0.1/ {system("rsync -a source dest")}' 

(Чтобы быть ясным, я инициирую эти неудавшиеся логины с сервера сам, специально, как способ запуска rsync на клиентской машине, как это было предложено мне в этом потоке .)

Теперь я хотел бы приостановить весь процесс обнаружения, чтобы я мог игнорировать данную попытку входа. Мое мышление состоит в том, чтобы сделать одно из трех:

  1. Предотвратите ssh от создания сообщения «Недопустимый пользователь»,
  2. Предотвратите вывод из него tail или
  3. Не позволяйте awk видеть это.

Я попытался приостановить, а затем возобновить все три процесса, и вот что происходит:

ssh: пока туннель приостановлен, сервер ждет бесконечно, когда пытается подключиться к клиенту. Если я укажу параметр ConnectionTimeout при подключении к серверу, я могу сделать сбой подключения и заставить его создать другое сообщение об ошибке – успех! – но я чувствую, что этот подход требует проблем с условиями гонки.

tail & awk: вход накапливается, а эти программы приостанавливаются, а не игнорируются. Выходные данные просто подавляются до тех пор, пока процесс не будет возобновлен.

есть ли способ добиться того, что мне нужно?

One Solution collect form web for “Заставить процесс игнорировать / отбрасывать накопленный вход во время приостановки?”

Вы можете приостановить только awk и очистить трубу, которую она читает из-под ног, прежде чем возобновить ее. В Linux-системах и GNU dd :

Где $pid – это PID awk :

 kill -s STOP "$pid" 

остановить его и

 dd iflag=nonblock if="/proc/$pid/fd/0" > /dev/null; kill -s CONT "$pid" 

возобновить.

Это предполагает, что труба не заполнена (по умолчанию 64KiB в Linux), так как иначе tail мог быть заблокирован. Чтобы обойти это, вы можете промыть трубку:

 socat -T0.2 -u "/proc/$pid/fd/0" /dev/null 

Это будет очищать то, что в настоящее время находится в трубе, и продолжать читать, пока не появится больше 0,2 секунды, чтобы tail мог догнать то, что он еще не прочитал из файла, если он есть.

Linux и Unix - лучшая ОС в мире.