Заставить процесс игнорировать / отбрасывать накопленный вход во время приостановки?
Таким образом, у меня открыт открытый туннель 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 на клиентской машине, как это было предложено мне в этом потоке .)
- почему местная авария убила мои удаленные задания?
- Что означает «fg»?
- Что остановит выполнение задачи в фоновом режиме?
- Что такое использование команды bg в реальном мире?
- Почему не ставится elinks в фоновом режиме, а затем возобновляется с `fg` работать надежно?
Теперь я хотел бы приостановить весь процесс обнаружения, чтобы я мог игнорировать данную попытку входа. Мое мышление состоит в том, чтобы сделать одно из трех:
- Предотвратите
ssh
от создания сообщения «Недопустимый пользователь», - Предотвратите вывод из него
tail
или - Не позволяйте
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
мог догнать то, что он еще не прочитал из файла, если он есть.