Подавить вывод ошибки доступа к Linux

Обновлено: 03.07.2024

В списке ошибок отображается информация об определенном сообщении об ошибке. Вы можете скопировать номер ошибки или текст строки ошибки из окна вывода. Чтобы отобразить окно вывода, нажмите Ctrl+Alt+O. См. Окно вывода.

Окно "Список ошибок" позволяет выполнять следующие задачи:

Отображение ошибок, предупреждений и сообщений, возникающих при написании кода.

Найти синтаксические ошибки, отмеченные IntelliSense.

Найти ошибки развертывания, определенные ошибки статического анализа и ошибки, обнаруженные при применении политик корпоративного шаблона.

Дважды щелкните любую запись сообщения об ошибке, чтобы открыть файл, в котором возникает проблема, и перейти к местоположению ошибки.

Фильтрация отображаемых записей и столбцов информации для каждой записи.

Выполняйте поиск по определенным терминам и ограничивайте поиск только текущим проектом или документом.

Чтобы отобразить список ошибок, выберите «Просмотр» > «Список ошибок» или нажмите Ctrl+\+E.

Вы можете выбрать вкладки "Ошибки", "Предупреждения" и "Сообщения", чтобы просмотреть различные уровни информации.

Чтобы отсортировать список, щелкните заголовок любого столбца. Чтобы снова выполнить сортировку по дополнительному столбцу, удерживайте нажатой клавишу Shift и щелкните заголовок другого столбца. Чтобы выбрать, какие столбцы отображать, а какие скрыть, выберите «Показать столбцы» в контекстном меню. Чтобы изменить порядок отображения столбцов, перетащите заголовок любого столбца влево или вправо.

Фильтры списка ошибок

Есть два типа фильтров в двух раскрывающихся списках, один справа от панели инструментов и один слева от панели инструментов. В раскрывающемся списке в левой части панели инструментов указан набор файлов кода для использования (Все решение, Открытые документы, Текущий проект, Текущий документ).

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

Открытые документы: отображение ошибок, предупреждений и сообщений для открытых документов.

Текущий проект: отображение ошибок, предупреждений и сообщений из проекта текущего выбранного документа в редакторе или выбранного проекта в обозревателе решений.

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

Текущий документ: отображение ошибок, предупреждений и сообщений для текущего выбранного документа в редакторе или обозревателе решений.

Если к результатам поиска в данный момент применен фильтр, имя фильтра отображается в строке заголовка списка ошибок. Кнопки «Ошибки», «Предупреждения» и «Сообщения» затем отображают количество отображаемых отфильтрованных элементов вместе с общим количеством элементов. Например, кнопки показывают «x из y ошибок». Если фильтр не применяется, в строке заголовка отображается только "Список ошибок".

Список в правой части панели инструментов указывает, следует ли отображать ошибки сборки (ошибки, возникающие в результате операции сборки), или IntelliSense (ошибки, обнаруженные до запуска сборки), или и то, и другое.

Поиск

Используйте текстовое поле «Поиск в списке ошибок» в правой части панели инструментов «Список ошибок», чтобы найти определенные ошибки в списке ошибок. Вы можете выполнять поиск в любом видимом столбце в списке ошибок, и результаты поиска всегда сортируются по столбцу с приоритетом сортировки, а не по запросу или примененному фильтру. Если вы нажмете клавишу Esc, когда фокус находится в списке ошибок, вы можете очистить условие поиска и отфильтрованные результаты поиска. Вы также можете нажать X справа от текстового поля, чтобы очистить его.

Вы можете скопировать список ошибок и сохранить его в файл. Выберите ошибки, которые вы хотите скопировать, и щелкните их правой кнопкой мыши, затем в контекстном меню выберите «Копировать». Затем вы можете вставить ошибки в файл. Если вы вставите ошибки в электронную таблицу Excel, поля появятся в виде разных столбцов.

Список элементов пользовательского интерфейса

Отображает различные типы записей списка ошибок (Ошибка, Сообщение, Предупреждение, Предупреждение (активно), Предупреждение (неактивно).

В этом руководстве вы узнаете все, что вам нужно знать о входе в систему NGINX и о том, как это может помочь вам устранить неполадки и быстро решить любую проблему, с которой вы можете столкнуться на своем веб-сервере. Мы обсудим, где хранятся журналы и как получить к ним доступ, как настроить их формат и как централизовать их в одном месте с помощью Syslog или службы управления журналами.

Предпосылки

Чтобы выполнить это руководство, вам потребуется следующее:

  • Сервер Linux, на котором есть пользователь без полномочий root с привилегиями sudo. Мы протестировали команды, показанные в этом руководстве, на сервере Ubuntu 20.04.
  • Веб-сервер NGINX установлен и включен на вашем сервере.

Шаг 1. Поиск файлов журнала NGINX

NGINX записывает журналы всех своих событий в два разных файла журналов:

  • Журнал доступа: этот файл содержит информацию о входящих запросах и посещениях пользователей.
  • Журнал ошибок: этот файл содержит информацию об ошибках, возникших при обработке запросов, или другие диагностические сообщения о веб-сервере.

Расположение обоих файлов журнала зависит от основной операционной системы веб-сервера NGINX и режима установки. В большинстве дистрибутивов Linux оба файла находятся в каталоге /var/log/nginx/ как access.log и error.log соответственно.

Аналогично запись в журнале ошибок может выглядеть так, как показано ниже, которая была создана из-за того, что сервер не смог найти запрошенный выше файл favicon.ico.

В следующем разделе вы узнаете, как просмотреть оба файла журнала NGINX из командной строки.

Шаг 2. Просмотр файлов журнала NGINX

Проверить журналы NGINX можно различными способами. Один из наиболее распространенных методов включает использование команды tail для просмотра записей журнала в режиме реального времени:

Вы увидите следующий вывод:

Команда tail печатает последние 10 строк из выбранного файла. Параметр -f заставляет его продолжать отображать последующие строки, добавляемые в файл, в режиме реального времени.

Чтобы просмотреть все содержимое файла журнала NGINX, вы можете использовать команду cat или открыть его в текстовом редакторе:

Если вы хотите отфильтровать строки, содержащие определенный термин, вы можете использовать команду grep, как показано ниже:

Приведенная выше команда напечатает все строки, содержащие GET /favicon.ico, чтобы мы могли увидеть, сколько запросов было сделано для этого ресурса.

Шаг 3. Настройка журналов доступа NGINX

Журнал доступа NGINX хранит данные о входящих клиентских запросах к серверу, что полезно при расшифровке того, что пользователи делают в приложении и какие ресурсы запрашиваются. В этом разделе вы узнаете, как настроить, какие данные будут храниться в журнале доступа.

При выполнении приведенных ниже инструкций следует помнить, что вам потребуется перезапустить службу nginx после изменения файла конфигурации, чтобы изменения вступили в силу.

Включение журнала доступа

Эта директива также применима к блокам конфигурации сервера и местоположения для определенного веб-сайта:

Отключение журнала доступа

В тех случаях, когда вы хотите отключить журнал доступа NGINX, вы можете использовать специальное значение off:

Вы также можете отключить журнал доступа к виртуальному серверу или определенным URI, изменив конфигурацию его сервера или блока местоположения в каталоге /etc/nginx/sites-available/:

Ведение журнала в несколько файлов журнала доступа

Если вы хотите дублировать записи журнала доступа в отдельные файлы, вы можете сделать это, повторив директиву access_log в основном файле конфигурации или в блоке сервера, как показано ниже:

Не забудьте после этого перезапустить службу nginx:

Объяснение формата журнала доступа по умолчанию

Записи журнала доступа, созданные с использованием конфигурации по умолчанию, будут выглядеть следующим образом:

Вот разбивка приведенного выше сообщения журнала:

  • 127.0.0.1 : IP-адрес клиента, отправившего запрос.
  • alice : имя удаленного журнала (имя, используемое для входа пользователя).
  • Алиса : удаленное имя пользователя (имя пользователя, вошедшего в систему).
  • [07/May/2021:10:44:53 +0200] : дата и время запроса.
  • "GET / HTTP/1.1": метод запроса, путь и протокол.
  • 200 : код ответа HTTP.
  • 396 : размер ответа в байтах.
  • "-" : IP-адрес реферера (- используется, когда он недоступен).
  • "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/90.0.4531.93 Safari/537.36" — подробная информация об агенте пользователя.

Шаг 4. Создание пользовательского формата журнала

Это дает запись журнала в следующем формате:

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

Вот объяснение каждой переменной, используемой в пользовательском формате журнала, показанном выше:

Вы также можете использовать следующие переменные в собственном формате журнала (полный список см. здесь):

  • $upstream_connect_time : время, затраченное на установление соединения с вышестоящим сервером.
  • $upstream_header_time : время между установлением соединения и получением первого байта заголовка ответа от вышестоящего сервера.
  • $upstream_response_time : время между установлением соединения и получением последнего байта тела ответа от вышестоящего сервера.
  • $request_time : общее время, затраченное на обработку запроса.
  • $gzip_ratio : коэффициент сжатия gzip (если gzip включен).

После создания пользовательского формата журнала его можно применить к файлу журнала, указав второй параметр в директиве access_log:

Эту функцию можно использовать для записи различной информации в отдельные файлы журналов. Сначала создайте форматы журнала:

Затем примените их, как показано ниже:

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

Шаг 5. Форматирование журналов доступа в формате JSON

Распространенный способ настройки журналов доступа NGINX — форматирование их в формате JSON. Этого довольно просто добиться, объединив директиву log_format с параметром escape=json, представленным в Nginx 1.11.8, для экранирования символов, недопустимых в JSON:

После применения формата custom_json к файлу журнала и перезапуска службы nginx вы увидите записи журнала в следующем формате:

Шаг 6. Настройка журналов ошибок NGINX

Всякий раз, когда NGINX обнаруживает ошибку, он сохраняет данные о событии в журнале ошибок, чтобы системный администратор мог обратиться к нему позже. В этом разделе описывается, как включить и настроить журналы ошибок по своему усмотрению.

Включение журнала ошибок

Директива error_log может принимать два параметра. Первый — это расположение файла журнала (как показано выше), а второй — необязательный и устанавливает уровень серьезности журнала. События с более низким уровнем серьезности, чем установленный, не будут регистрироваться.

Это возможные уровни серьезности (от самого низкого до самого высокого) и их значение:

  • debug : сообщения, используемые для отладки.
  • info : информационные сообщения.
  • уведомление: произошло важное событие.
  • предупреждение: произошло нечто неожиданное.
  • ошибка: что-то не удалось.
  • crit : критические состояния.
  • оповещение: ошибки, требующие немедленных действий.
  • emerg : система непригодна для использования.

Отключение журнала ошибок

Журнал ошибок NGINX можно отключить, установив для директивы error_log значение off или перенаправив его на /dev/null :

Запись ошибок в несколько файлов

Как и в случае с журналами доступа, вы можете регистрировать ошибки в нескольких файлах, а также использовать разные уровни серьезности:

В этой конфигурации все события, кроме событий уровня отладки, будут записываться в файл error.log, а экстренные события помещаются в отдельный файл emerg_error.log.

Шаг 7. Отправка журналов NGINX в Syslog

Помимо ведения журнала в файл, также можно настроить NGINX для передачи своих журналов в службу системного журнала, особенно если вы уже используете его для других системных журналов. Запись в системный журнал выполняется путем указания префикса syslog: либо в директиве access_log, либо в директиве error_log:

Сообщения журнала отправляются на сервер, который можно указать с помощью имени домена, адреса IPv4 или IPv6 или пути сокета домена UNIX.

В приведенном выше примере сообщения журнала ошибок отправляются в сокет домена UNIX на уровне ведения журнала отладки, а журнал доступа записывается на сервер системного журнала с адресом IPv4 и портом 1234 . Параметр объекта= указывает тип программы, регистрирующей сообщение, параметр tag= применяет настраиваемый тег к сообщениям системного журнала, а параметр серьезности= устанавливает уровень серьезности записи системного журнала для сообщений журнала доступа.

Дополнительную информацию об использовании Syslog для управления журналами можно найти в нашем руководстве по просмотру и настройке системных журналов в Linux.

Шаг 8. Централизация журналов NGINX

В этом разделе мы опишем, как можно централизовать журналы NGINX в службе управления журналами с помощью Vector, высокопроизводительного инструмента для создания конвейеров наблюдения. Это важный шаг при администрировании нескольких серверов, чтобы вы могли отслеживать все свои журналы в одном месте (вы также можете централизовать свои журналы с помощью сервера Rsyslog).

Следующие инструкции предполагают, что вы создали бесплатную учетную запись Logtail и получили исходный токен. Продолжайте и следуйте соответствующим инструкциям по установке Vector для вашей операционной системы. Например, в Ubuntu вы можете запустить следующие команды для установки Vector CLI:

Являетесь ли вы новым пользователем Linux или опытным программистом bash, весьма вероятно, что вы столкнулись с загадочной командой 2>/dev/null. Хотя эта команда выглядит технически сложной, ее назначение очень простое. Это относится к нулевому устройству, которое используется для подавления вывода различных команд. В этой статье мы разберем каждую часть команды 2>/dev/null, объясним ее назначение и увидим примеры ее использования.

Нулевое устройство — ‘/dev/null’

Все системы на базе Linux имеют функцию, называемую виртуальными устройствами. Эти виртуальные устройства взаимодействуют как настоящие файлы в операционной системе. Работа таких виртуальных устройств аналогична работе реальных устройств; они используются для записи и чтения данных.Основное различие между ними заключается в том, что данные для виртуальных устройств предоставляются операционной системой.

/dev/null — это нулевое устройство — особый тип виртуального устройства. Он присутствует в каждой системе Linux, и цель этого устройства — отбрасывать все, что ему отправлено, и читать конец файла (EOF). Большинство виртуальных устройств используются для чтения данных; однако /dev/null уникален, поскольку он используется для подавления любых записываемых в него данных. Проще говоря, он действует как черная дыра для любых данных, которые записываются в него в операционных системах Linux.

Теперь давайте взглянем на остальные части команды 2 > /dev/null

Дескриптор файла — «2»

Каждое выполнение команды в Linux создает три связанных файла: стандартный ввод, стандартный вывод и стандартный файл ошибок. Операционная система Linux называет каждый из этих файлов уникальным неотрицательным целым числом.

  • "0" для стандартного ввода
  • «1» для стандартного вывода.
  • 2 – стандартная ошибка

Технические термины для стандартного ввода, стандартного вывода и стандартных потоков ошибок: stdin, stdout и stderr соответственно.

Мы знаем, что цифра "2" в команде "2>/dev/null" относится к стандартному потоку ошибок (stderr).

Оператор перенаправления файла — ‘>’

Символ «>» известен как оператор перенаправления файла. Его цель — направить то, что находится слева от него, на команды справа. Проще говоря, любая строка данных слева будет направлена ​​в правую часть оператора.

На данный момент мы поняли назначение каждого компонента команды 2>/dev/null. Он отправляет поток ошибок в /dev/null, который отбрасывает его. Другими словами, эта команда используется для отмены и подавления выходных данных об ошибках. Однако, если вы опытный ветеран Linux, вы можете посмотреть содержимое файла /dev/null, выполнив в терминале следующую команду:


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

Использование 2>/dev/null

Поскольку мы знаем, что команда 2>/dev/null используется для отбрасывания ошибок, она всегда будет использоваться в сочетании с другими командами. Аналогичный подход мы увидим в следующих примерах. Вы можете открыть терминал либо через меню приложений, либо с помощью сочетания клавиш Ctrl + Alt + T.

В первом примере мы будем искать в каталоге /sys/ случайную строку (в данном случае helloworld). Команда для поиска — grep, а ее аргументом будет строка поиска. Введите следующую команду для поиска строки.


Эта команда поиска обязательно будет отображать многочисленные ошибки, поскольку она используется без root-доступа. Мы отправим его поток ошибок в /dev/null с помощью команды 2>/dev/null, чтобы отбросить эти ошибки.


Мы видим, что вывод команды намного аккуратнее и проще, чем предыдущий. Причина в том, что ошибки отбрасываются с помощью 2> /dev/null, а поскольку команде grep не удалось найти ни одного файла, соответствующего нашей строке «helloworld», она не показывает никаких результатов.


Если мы хотим исключить все неудачные проверки связи, мы можем использовать команду 2>/dev/null:


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



Иногда вам может понадобиться подавить весь вывод команды (включая стандартный вывод и стандартные ошибки). Мы можем добиться этого, используя устройство /dev/null немного другим способом. Вы можете ввести следующую команду, чтобы подавить весь вывод:

Обратите внимание, что порядок команд здесь очень важен. После выполнения команды ping «>/dev/null» говорит системе подавить вывод, а «2>&1» направляет стандартный поток ошибок на стандартный вывод. Таким образом, весь вывод команды отбрасывается.

Заключение

В этой статье мы рассмотрели команду 2>/dev/null и простые примеры, и, надеюсь, теперь вы понимаете, что делает каждая ее часть.Однако это только вершина айсберга; Нулевые устройства используются множеством способов в программировании bash. Некоторые из более продвинутых применений включают проверку существования файлов, автоматическую установку пакетов и предотвращение нежелательных исключений сценариев.

Об авторе

Зееман Мемон

Привет! Я инженер-программист по образованию, блоггер по навыкам, который любит писать о технологиях, разрабатывать веб-сайты и заниматься SEO. Вы можете связаться со мной в LinkedIn.

Обработка ошибок Bash на примере

В этой статье я представляю несколько приемов для обработки ошибок. Некоторые из них строго не подпадают под категорию обработки ошибок (реактивный способ обработки непредвиденных обстоятельств), а также некоторые приемы, позволяющие избежать ошибок до того, как они произойдут.< /p>

Пример из практики. Простой скрипт, который загружает отчет об оборудовании с нескольких хостов и вставляет его в базу данных.

Скажем, у вас есть задание cron в каждой из ваших систем Linux, и у вас есть сценарий для сбора информации об оборудовании из каждой:

Если все идет хорошо, вы собираете свои файлы параллельно, потому что у вас не более десяти систем. Вы можете подключиться по ssh ко всем из них одновременно, а затем показать информацию об оборудовании каждого из них.

Вот несколько возможных причин, по которым что-то пошло не так:

  • Ваш отчет не был выполнен, поскольку сервер не работал
  • Не удалось создать каталог для сохранения файлов
  • Инструменты, необходимые для запуска скрипта, отсутствуют
  • Вы не можете получить отчет, потому что ваш удаленный компьютер дал сбой
  • Один или несколько отчетов повреждены

В текущей версии скрипта есть проблема — он будет выполняться от начала до конца, с ошибками или нет:

Далее я продемонстрирую несколько вещей, которые сделают ваш скрипт более надежным и в некоторых случаях восстановят его после сбоя.

Ядерный вариант: отказ жесткий, отказ быстрый

Правильный способ обработки ошибок – проверить, успешно ли завершилась программа, используя коды возврата. Это звучит очевидно, но коды возврата, целое число, хранящееся в bash $? или $! переменные, имеют иногда более широкое значение. Страница руководства bash сообщает вам:

Для целей оболочки команда, завершающаяся с нулевым
статусом выхода, выполнена успешно. Нулевой статус выхода указывает на успех.
Ненулевой статус выхода указывает на сбой. Когда команда
заканчивается фатальным сигналом N, bash использует значение 128+N в качестве
статуса выхода.

Дополнительные ресурсы по Linux

Как обычно, вы всегда должны читать справочные страницы сценариев, которые вы вызываете, чтобы узнать, какие соглашения существуют для каждого из них. Если вы программировали на таких языках, как Java или Python, то вы, скорее всего, знакомы с их исключениями, разными значениями и тем, что не все они обрабатываются одинаково.

Если вы добавите set -o errexit в свой скрипт, с этого момента он прервет выполнение, если существует какая-либо команда с кодом != 0 . Но errexit не используется при выполнении функций внутри условия if, поэтому вместо запоминания этого исключения я предпочитаю явную обработку ошибок.

Посмотрите на вторую версию скрипта. Это немного лучше:

Вот что изменилось:

  • В строках 11 и 12 я включаю трассировку ошибок и добавляю «ловушку», чтобы сообщить пользователю, что произошла ошибка и впереди турбулентность. Вместо этого вы можете убить свой сценарий здесь, я покажу вам, почему это может быть не лучшим решением.
  • Строка 20, если каталог не существует, попробуйте создать его в строке 21. Если создать каталог не удалось, выйдите с ошибкой.
  • В строке 27 после запуска каждого фонового задания я фиксирую PID и связываю его с машиной (соотношение 1:1).
  • В строках 33–35 я жду завершения задачи scp, получаю код возврата и, если это ошибка, прерываю ее.
  • В строке 37 я проверяю, может ли файл быть проанализирован, в противном случае я завершаю работу с ошибкой.

Итак, как теперь выглядит обработка ошибок?

Как видите, эта версия лучше обнаруживает ошибки, но она очень неумолима. Кроме того, он не обнаруживает все ошибки, не так ли?

Когда вы застряли и хотите, чтобы у вас был будильник

Код выглядит лучше, за исключением того, что иногда scp мог зависнуть на сервере (при попытке скопировать файл), потому что сервер слишком занят, чтобы отвечать, или просто находится в плохом состоянии.

Еще один пример — попытаться получить доступ к каталогу через NFS, где $HOME смонтирован с сервера NFS:

Через несколько часов вы обнаружите, что точка подключения NFS устарела, а ваш скрипт завис.

Тайм-аут — это решение. И на помощь приходит тайм-аут GNU:

Здесь вы пытаетесь регулярно убивать (сигнал TERM) процесс после 10.0 секунд после его запуска. Если он все еще работает через 20,0 секунд, отправьте сигнал KILL ( kill -9 ). Если вы сомневаетесь, проверьте, какие сигналы поддерживаются вашей системой (например, kill -l ).

Если это непонятно из моего диалога, посмотрите на сценарий для большей ясности.

Вернуться к исходному сценарию, чтобы добавить еще несколько параметров, и у вас есть третья версия:

Какие изменения?:

  • Между строками 16–22 проверьте наличие всех необходимых инструментов зависимостей. Если он не может выполниться, тогда «Хьюстон, у нас проблема».
  • Создана функция remote_copy, которая использует тайм-аут, чтобы гарантировать, что scp завершится не позднее 45,0 секунд (строка 33).
  • Добавлено время ожидания соединения 5 секунд вместо TCP по умолчанию (строка 37).
  • Добавлена ​​повторная попытка в scp в строке 38: 3 попытки с ожиданием 1 секунда между каждой.

Есть и другие способы повторить попытку при возникновении ошибки.

В ожидании конца света: как и когда повторить попытку

Вы заметили, что для команды scp добавлена ​​повторная попытка. Но это повторение только для неудачных подключений, что, если команда завершится ошибкой в ​​середине копирования?

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

Вот изменения в remote_copy , если кратко (четвертая версия):

Как это выглядит сейчас? В этом прогоне у меня одна система не работает (mac-pro-1-1) и одна система без файла (macmini2). Вы можете видеть, что копия с сервера dmaf5 работает сразу, но для двух других есть повторная попытка в течение случайного времени между 1 и 60 секундами перед выходом:

Если я потерплю неудачу, мне придется делать это снова и снова? Использование контрольной точки

Предположим, что удаленная копия является самой дорогостоящей операцией всего этого скрипта, и что вы хотите или можете повторно запустить этот скрипт, возможно, используя cron или делая это вручную два раза в день, чтобы убедиться, что вы его заберете. файлы, если одна или несколько систем не работают.

Вы можете на один день создать небольшой «кэш состояния», в который будут записываться только успешные операции обработки на каждом компьютере. Если там есть система, не утруждайте себя повторной проверкой на этот день.

Некоторые программы, такие как Ansible, делают что-то подобное и позволяют вам повторить плейбук на ограниченном количестве машин после сбоя ( --limit @/home/user/site.retry ).

В новой версии (пятой версии) скрипта есть код для записи состояния копии (строки 15–33):

Вы заметили ловушку в строке 22? Если сценарий прерывается (убивается), я хочу убедиться, что весь кеш недействителен.

А затем добавьте эту новую вспомогательную логику в функцию remote_copy (строки 52–81):

При первом запуске распечатывается новое новое сообщение для каталога кеша:

Если вы запустите его снова, то скрипт узнает, что dma5f готов к работе, и не нужно повторять попытку копирования:

Представьте, насколько это ускоряется, когда у вас есть больше машин, которые не нужно повторно посещать.

Оставляя крохи позади: что записывать, как записывать и подробный вывод

Если вы похожи на меня, мне нравится немного контекста, с которым можно сопоставить, когда что-то идет не так. Операторы эха в скрипте хороши, но что, если бы вы могли добавить к ним отметку времени.

Если вы используете logger , вы можете сохранить вывод в journalctl для последующего просмотра (даже агрегирования с другими инструментами). Самое приятное то, что вы сразу же демонстрируете мощь journalctl.

Поэтому вместо того, чтобы просто делать echo , вы также можете добавить вызов logger, используя новую функцию bash под названием « сообщение »:

Вы видите, что можете сохранять отдельные поля как часть сообщения, например приоритет, сценарий, сгенерировавший сообщение, и т. д.

Так чем же это полезно? Что ж, вы могли получать сообщения между 13:26 и 13:27, только ошибки ( priority=0 ) и только для нашего скрипта ( collect_data_from_servers.v6.sh ), вывод в формате JSON:

Поскольку это структурированные данные, другие сборщики журналов могут просматривать все ваши компьютеры, объединять журналы сценариев, и тогда у вас есть не только данные, но и информация.

Вы можете ознакомиться со всей шестой версией сценария.

Не торопитесь заменять данные, пока не проверите их.


Если вы заметили с самого начала, я снова и снова копировал поврежденный файл JSON:

Это легко предотвратить. Скопируйте файл во временное место, и если файл поврежден, не пытайтесь заменить предыдущую версию (и оставьте неверную версию для проверки. Строки 99-107 седьмой версии скрипта):

Выберите правильные инструменты для задачи и подготовьте свой код с первой строки

Одним из очень важных аспектов обработки ошибок является правильное кодирование. Если у вас плохая логика в вашем коде, никакая обработка ошибок не сделает его лучше. Чтобы это было кратко и имело отношение к bash, ниже я дам вам несколько советов.

Вы должны ВСЕГДА проверять синтаксис ошибок перед запуском скрипта:

Серьезно. Он должен быть таким же автоматическим, как и любой другой тест.

Прочитайте справочную страницу bash и ознакомьтесь с обязательными параметрами, такими как:

Используйте ShellCheck для проверки скриптов bash

Очень легко пропустить простые проблемы, когда ваши скрипты начинают разрастаться. ShellCheck — один из тех инструментов, который убережет вас от ошибок.

Если вам интересно, финальная версия скрипта после прохождения ShellCheck находится здесь. Идеальная чистота.

Вы заметили что-то с фоновыми процессами scp

Карьерный совет

Возможно, вы заметили, что если вы закроете скрипт, он оставит несколько разветвленных процессов. Это нехорошо, и это одна из причин, по которой я предпочитаю использовать такие инструменты, как Ansible или Parallel, для решения задач такого типа на нескольких хостах, позволяя фреймворкам выполнять правильную очистку за меня. Конечно, вы можете добавить дополнительный код для обработки этой ситуации.

Этот bash-скрипт потенциально может создать форк-бомбу. Он не контролирует, сколько процессов должно запускаться одновременно, что является большой проблемой в реальной производственной среде. Кроме того, существует ограничение на количество одновременных сеансов ssh, которые вы можете иметь (не говоря уже о потреблении полосы пропускания). Опять же, я написал этот вымышленный пример на bash, чтобы показать вам, как вы всегда можете улучшить программу, чтобы она лучше обрабатывала ошибки.

<р>1. Вы должны проверить код возврата ваших команд. Это может означать решение повторить попытку до тех пор, пока временное состояние не улучшится, или закоротить весь сценарий.
2. Говоря о переходных условиях, вам не нужно начинать с нуля. Вы можете сохранить статус успешных задач, а затем повторить попытку с этого момента.
3. Баш «ловушка» — ваш друг. Используйте его для очистки и обработки ошибок.
4. При загрузке данных из любого источника исходите из того, что они повреждены. Никогда не перезаписывайте свой хороший набор данных свежими данными, пока не выполните некоторые проверки целостности.
5. Воспользуйтесь преимуществами journalctl и настраиваемых полей. Вы можете выполнять сложный поиск проблем и даже отправлять эти данные в агрегаторы журналов.
6. Вы можете проверить статус фоновых задач (включая подоболочки). Просто не забудьте сохранить PID и подождать.
7. И, наконец: используйте помощник Bash lint, такой как ShellCheck. Вы можете установить его в свой любимый редактор (например, VIM или PyCharm). Вы будете удивлены, сколько ошибок в сценариях Bash остаются незамеченными.

Читайте также: