Передача команд с очень большим объемом вывода

У меня была аналогичная проблема с Arch, в моем случае это была настройка, которая была перезаписана при обновлении последней версии Gnome.

Используя настройки gnome -в разделе «Клавиатура и мышь», для эмуляции щелчка мыши было установлено значение «Пальцы». Я отключил его и включил параметр «Область», который использует нижнюю правую часть сенсорной панели для щелчка правой кнопкой мыши.

После этого правый щелчок работает как раньше.

19
02.01.2020, 19:01
2 ответа

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

«Блокировка» просто означает, что когда tarвызывает write()библиотечную функцию (или эквивалентную ), вызов не будет возвращен до тех пор, пока данные не будут доставлены в конвейерный буфер, что может занять некоторое время, если lzipмедленно читает из того же буфера. Вы должны увидеть это в top, где tarбудет замедляться и много спать по сравнению с lzip(, предполагая, что tarна самом деле быстрее, чемlzip).

Таким образом, вы не заполнили бы значительный объем оперативной памяти своим конвейером. Чтобы сделать это (, если вы хотите ), вы можете использовать что-то вроде pvпосередине, с некоторым большим буфером (здесь, гигабайт):

tar -cvf - /tmp/source-dir | pv --buffer-size 1G | lzip -o /media/my-usb/result.lz -

Это по-прежнему будет блокировать tarкаждый раз, когда блокируется pv. pvблокируется, когда его буфер заполнен, и он не может писать в lzip.


Обратная ситуация работает аналогичным образом, т.е. если у вас есть медленная левая -сторона конвейера, записывающая в быструю правую -сторону, потребитель справа будет блокировать read()до тех пор, пока есть данные, которые нужно прочитать из канала.

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

45
27.01.2020, 19:44

GNU tar имеет--lzip опцию для «фильтровать архив через lzip », поэтому вы можете использовать вместо этого:

tar -cvf --lzip /media/my-usb/result.lz /tmp/source-dir

При ответе на вопрос :в вашем случае система будет правильно управлять каналом, используя размер системного буфера по умолчанию.

2
27.01.2020, 19:44

Теги

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