Тайм-аут при обратном просмотре 0.0.0.0

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

sed -e 's/$/\t/' -e 's/[^\t]*_[^\t]*\t//g' -e 's/\t$//'

Это

  1. Добавляет табуляцию в конце каждой строки (таким образом создавая, по сути, n+1  -е поле, которое является нулевым ).
  2. Находит все поля (строки не -символов табуляции ), которые содержат _и удаляет их и следующую вкладку, ничем их не заменяя. Это работает с n  -м полем (, т. е. с последним полем в исходной строке ). потому что шаг 1 добавил вкладку в конце.
  3. Удаляет лишнюю вкладку в конце строки.

Здесь есть функция (, о которой, как я знаю, вы не просили, но вы оцените ее, когда увидите, что она доступна )что он сохраняет пустые поля:

$ cat file3
The             brown           jumps           the             dog.
        quick           fox             over            lazy
Four            and_            years
        score           seven           ago...

$ (the_above_command) file3
The             brown           jumps           the             dog.
        quick           fox             over            lazy
Four                    years
        score           seven           ago...

П.С. В зависимости от того, какая у вас версия sed, вам может потребоваться ввести в команду фактические вкладки вместо \t. Или, если вы используете bash, вы можете использовать $'…'для командных строк sed, содержащих \t.

3
27.08.2019, 12:08
1 ответ

Возможно, сеть работала не полностью (, поэтому DNS-запрос был потерян ), или это была просто случайная потеря пакетов (, такое случается, особенно в сети Wi-Fi ). С первым вы можете справиться, подождав немного дольше, чтобы запустить приложение; последнее в значительной степени неизбежно.

Некоторые подходы, которые могут вам помочь:

  • Исправьте приложение. Я подозреваю, что это не вариант, иначе вы бы уже сделали это.

  • Поместите запись для 0.0.0.0 в /etc/hosts. Затем он должен разрешиться через «файлы», что будет практически мгновенно. Конечно, для этого нужно дать 0.0.0.0 имя, которое может или не может изменить поведение приложения. Если это работает для вас, это самый простой вариант.

  • Если вам не нужен DNS на коробке, полностью отключите его, удалив его из /etc/nsswitch.conf.

  • Запустите локальный кеш DNS, который можно настроить как авторитетный для 0.0.0.in -addr.arpa. Затем он может быстро вернуть NXDOMAIN для 0.0.0.0. Есть несколько программ, предназначенных для обеспечения локального кэширования, которые могут это сделать. Например, dnsmasq достаточно популярен. Есть и другие, такие как Unbound, в зависимости от необходимых вам функций.

  • По крайней мере, с glibc вы можете изменить время ожидания и повторную попытку, поместив что-то вроде options timeout:2 attempts:4в /etc/resolv.conf. Если вы уменьшите время ожидания, вы, вероятно, захотите увеличить количество попыток, потому что иногда DNS-серверу может потребоваться некоторое время, чтобы разрешить его (, но как только он это сделает, он должен быстро ответить из своего кеша ).

  • Вы можете написать свой собственный модуль NSS для быстрого hostsотказа при поиске 0.0.0.0. По крайней мере, для glibc вы можете найти инструкции в glibc manual §29 .

1
27.01.2020, 21:29

Теги

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