Ошибка broken pipe 32 яндекс диск

Обновлено: 04.07.2024

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

При запуске юнит-тестов я часто получаю error: [Errno 32] Broken pipe. Кажется, что это безобидная ошибка, которая происходит во время тестирования, но я не смог предотвратить или иным образом подавить ее. Некоторые вещи, которые я пробовал, включают изменение обработки SIGPIPE на SIG_DFL и запуск .

У меня есть следующий код для сервера: import socket import threading def handle_client(client_socket): request = client_socket.recv(1024) print ("[*] Received: %s" % request) client_socket.send("ACK!".encode("utf-8")) client_socket.close() bind_ip = "0.0.0.0" bind_port = 9998 serv.

После удаления старой версии wine-1.8 и ее повторной установки я обнаружил ОШИБКУ в диспетчере пакетов для Неисправных пакетов : Preparing to unpack . /libwine_3.0-1ubuntu1_amd64.deb . Unpacking libwine:amd64 (3.0-1ubuntu1) . dpkg: error processing archive /var/cache/apt/archives/libwin.

У меня есть скрипт Python 3.7.4, использующий многопроцессорность и многопоточность для очистки API. Он использует запрос GET, чтобы получить статистику хэштега, а затем на этой странице собирает больше хэштегов, чтобы добавить их в список, который будет удален из API. Он работает в течение нескольк.

Эта программа Python: import concurrent.futures import multiprocessing import time class A: def __init__(self): self.event = multiprocessing.Manager().Event() def start(self): try: while True: if self.event.is_set(): break .

Я хочу, чтобы клиент взаимодействовал с сервером, используя соединение сокета TCP / IP. Когда соединение принимается на стороне сервера, создается дочерний процесс. Этот дочерний процесс читает и обрабатывает входящие данные. Я думал, что когда я выполняю последующие записи от клиента при открыто.

Я использую кластерную среду Airflow, в которой у меня есть четыре экземпляра AWS ec2 для серверов. экземпляры ec2 Сервер 1: веб-сервер, планировщик, очередь Redis, база данных PostgreSQL Сервер 2: Веб-сервер Сервер 3: Рабочий Сервер 4: Рабочий Моя установка работает отлично в течение трех месяцев.

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

Я запускаю несколько скриптов с командами, имеющими cat конвейерную обработку с grep, например: cat file.txt | grep "pattern" В большинстве случаев проблем нет. Но иногда я получаю ошибку ниже: cat: ошибка записи: сломанная труба Итак, как мне узнать, когда команда вызывает эту проблему и почему.

У меня есть 10 наборов данных файлов от 10 МБ до 8 ГБ, и я пытаюсь прочитать txt набора данных размером 8 ГБ, который я не могу прочитать из-за «¦» (сломанная труба) . Почти все, размер которых превышает 200 МБ, имеют ту же проблему а самые маленькие файлы имеют «нормальную» черту (|). Код такой.

Я живу в развивающейся стране и пытаюсь продолжить работу над большим проектом, пока я здесь. В настоящее время я пытаюсь протолкнуть около 10 ГБ изменений через ненадежное соединение со скоростью 100 кбит / с. Я точно не знаю, что происходит не так, но я не могу завершить отправку, которая уже не.

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

Я читал это: Вы можете использовать xinetd для добавления службы, запускающей ваш скрипт python. Стандартный ввод и вывод будет передаваться по сети на желаемый порт, поэтому вам не нужно изменять свои сценарии (методы ввода / raw_input и печати будут работать нормально). В результате я использую с.

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

Мы используем redis в весеннем загрузочном проекте. После выполнения определенного периода времени операция redis МОЖЕТ выдать ошибку сломанного канала, но иногда она будет успешной. Перезапуск службы решит эту проблему, но это не очень хорошая идея. Я не могу сказать причину, почему это происходит.

Я столкнулся со случаем, когда использование write() на стороне сервера на удаленном закрытом клиенте не возвращает 0. По словам человека 2 write: В случае успеха возвращается количество записанных байтов (ноль означает, что ничего не было записано). В случае ошибки возвращается -1, а значение errn.

Я знаю о screen , но это не тот ответ, который я ищу. Я думаю, что это вариант конфигурации sshd .

Возможно, ваш сервер закрывает слишком длинные простоя. Вы можете обновить либо ваш клиент ( ServerAliveInterval ), либо ваш сервер ( ClientAliveInterval )

Для обновления вашего сервера (и перезапустите sshd )

Или клиентская сторона:

Альтернативным решением было бы использовать mosh - мобильную оболочку . > . В отличие от ssh, он подключается через UDP и поддерживает роуминг. Вы можете начать свою сессию дома, приостановить работу своего ноутбука, взять его на работу /друзей /где бы вы ни располагали интернет, отказаться от своего ноутбука и продолжать работать так, как будто ничего не произошло. Это особенно полезно, если вы находитесь в паршивом интернет-соединении: он показывает мгновенную обратную связь, если ваши нажатия клавиш не доходят до сервера и постоянно пытается восстановить соединение.

Основная причина сбоев подключения заключается в том, что вам нужно добраться до сервера на UDP-порту (диапазон по умолчанию: 60000-61000) для работы mosh. Поэтому, если сервер находится за брандмауэром, вам в основном не повезло, если он не может пробить дыры в нем самостоятельно ( последствия для безопасности ).

Если вы хотите иметь более длительный период соединения, в клиенте добавьте:

ServerAliveCountMax по умолчанию это значение равно 3. Поэтому, когда ServerAliveInterval отправил 3 небольших пакета информации на ваш сервер, он автоматически выйдет из системы. Установка его на 1200 означает, что этот процесс должен произойти по крайней мере 1200 раз. Короче говоря, вы должны быть подключены не менее 30 * 1200 секунд (10 часов).

Обычно это означает, что ваше сетевое (TCP) соединение было сброшено. Например. ваш интернет-провайдер подключил вас или что-то вроде этого.

У меня была та же проблема, но это не так, как ожидалось. Если вы обнаружите, что в той же сети другой сервер пытается использовать тот же IP-адрес, вы столкнетесь с той же проблемой. Чтобы решить эту проблему, вам нужно проверить, есть ли другие серверы, которые используют один и тот же IP-адрес. Это можно сделать с помощью команды arp .

Я использую Debian, поэтому вот пример команд, которые я использую, чтобы определить, действительно ли другой сервер использует один и тот же IP-адрес.

Вы заметите два набора MAC-адреса, используя тот же IP-адрес. Избегайте конфликтов, установив один на другой IP-адрес.

Простой способ проверить, использует ли кто-нибудь другой IP-адрес:

  1. Отключите хост
  2. пинг одного и того же IP-адреса, чтобы узнать, использует ли другой компьютер этот IP-адрес

Чтобы узнать, какие компьютеры находятся в вашей сети, вы можете использовать этот Unix & Заголовок вопроса Linux: Как сделать найти, какие другие компьютеры подключены к локальной сети .

вопрос: есть ли способ, чтобы использовать flush=True на без BrokenPipeError ?

у меня есть скрипт pipe.py :

я называю это так из командной строки Unix:

и это возвращает:

так делает этот скрипт:

однако, когда я запускаю этот скрипт и вставьте его в head -n3000 :

тогда я получаю это ошибка:

Я также попробовал Решение ниже, но я все еще получаю BrokenPipeError :

на BrokenPipeError нормально, как сказал Фантом, потому что процесс чтения (head) завершается и закрывает свой конец трубы, пока процесс записи (python) все еще пытается писать.

Is и аномальное состояние, и скрипты python получают BrokenPipeError - точнее, интерпретатор Python получает системный сигнал SIGPIPE, который он ловит и поднимает BrokenPipeError чтобы скрипт мог обработать ошибку.

I слегка изменил свой скрипт на:

вот сценарий, который я использовал:

и вот результат python3.3 pipe.py | head -10 :

согласно документации Python, это выбрасывается, когда:

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

это связано с тем, что главная утилита читает из stdout , затем быстро закрывает его.

как вы можете видеть, это можно обойти, просто добавив sys.stdout.flush() после print() . Обратите внимание, что это иногда не работает в Python 3.

вы можете передайте это awk как это, чтобы получить тот же результат, что и head -3 :

надеюсь, это помогло, удачи!

как вы можете видеть на выходе, который вы опубликовали, последнее исключение возникает на этапе деструктора : вот почему у вас есть ignored В конце

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

каждое исключение, которое запускается при уничтожении объекта, вызовет стандартную ошибку, объясняющую, что исключение произошло и проигнорировано (это потому, что python сообщит вам, что что-то не может быть правильно обрабатывать в фазе уничтожения). В любом случае, такого рода исключения не могут быть кэшированы, и поэтому вы можете просто удалить вызовы, которые могут его генерировать или закрыть stderr .

вернемся к вопросу. Это исключение не является реальной проблемой (как говорят, оно игнорируется), но если вы не хотите его печатать, вы должны переопределить функцию, которая может быть вызвана, когда объект будет уничтожен или закрыт stderr как @SergeBallesta правильно предложил : в вашем случае вы можете остановка write и flush функция и никакое исключение не будет вызвано в контексте уничтожения

Ошибка «client_loop: send disconnect: Broken pipe»

Вас тоже бесит постоянно отваливающееся соединение SSH? Меня это пипец как бесит. Особенно когда пишешь длинную команду, нажимаешь Enter, а тебе вываливается «client_loop: send disconnect: Broken pipe». И снова подключаешься.

Поиск по интернетам ничего не давал кроме того, что тут и там советовали раскомментировать директиву ClientAliveInterval, причем советовали установить значение в 300, причем не объясняя почему именно 300 и что вообще такое ClientAliveInterval.

Само собой я последовал совету и поставил ClientAliveInterval равным 300. Соединение как разрывалось до этого, так и дальше продолжало разрываться. А потом я где-то нашел совет добавить директиву ServerAliveInterval. В итоге сервер перестал отвечать и пришлось восстанавливать бэкап. Тем самым в трубу улетели кучи и кучи настроек, поскольку бэкап был один единственный и там была система в дефолтном состоянии.

За что отвечает директива ClientAliveInterval?

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

Простыми словами. У вас открыт терминал, вы подключены к серверу. Выполнили пару команд и ушли читать мануал. Допустим ClientAliveInterval у нас 30, это значи через 30 секунд после последней нашей активности, сервер проверит подключены ли мы к серверу, получив отклик от клиента, сервер не будет разрывать соединение.

Ну вроде как все понятно. Но! Чисто гипотетически мы можем быть подключены не через самое надежное соединение. Например через USB-модем в зоне со слабым сигналом. Предположим в какой-то момент сигнал упал, а сервер нам шлет запрос. Клиент его не получит. Тут на сцену выходит другая директива.

Директива ClientAliveCountMax

По умолчанию значение ClientAliveCountMax равно 3. То есть получается что сервер отправит нам максимум три запроса без подтверждения и уже только тогда закроет соединение.

Если ClientAliveInterval равен 30, а ClientAliveCountMax 3, то сервер закроет соединение через 90 секунд, то есть через полторы минуты, если наш модем за это время не восстановит соединение.

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

Директива TCPKeepAlive

По умолчанию эта директива имеет значение yes. При активации ClientAliveInterval директиву TCPKeepAlive имеет смысл перевести в no. По сути сама по себе директива ничем особенным не помогает и не мешает, просто по мнению спецов, она может помочь злоумышленникам в атаке на сервер.

Добавляем настройки

У меня в Ubuntu Server 20.04 в файле /etc/ssh/sshd_config присутствует

Поэтому я просто создаю новый файл

И уже туда втыкаем

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

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