zsh с использованием 100% ЦП после запуска редактора атома

Это в основном дубликат моего ответа на SO . Однако, поскольку никто не упомянул здесь команду stdbuf , я решил, что должен добавить и ее сюда.

===============

В основном процесс, который читает из конвейера, может потреблять данные побайтно, как только они становятся доступными в конвейере. Однако, пока программы используют функции std io библиотеки libc, такие как чтение, запись и т. Д., Libc будет буферизовать ввод / вывод этих программ в зависимости от того, выполняет ли программа запись на терминал или нет.

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

В Linux, имея glibc, вы можете повлиять на это поведение с помощью команды stdbuf , например так:

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

Я использую строчный буфер вывода для команды cat , строковый буфер ввода и вывода для первой команды sed и строчный буфер ввода для последней команды sed .

3
27.04.2019, 14:49
1 ответ

Эта ошибка является результатом сомнительного дизайна в Atom. Более того, это не относится к Z Shell. Люди испытывают это и с другими снарядами.

Atom по какой-то причине хочет знать переменные среды вашей интерактивной оболочки входа в систему. Для этого он порождает экземпляр выбранной оболочки, приказывает ему запустить команду env (после выполнения всех своих сценариев запуска) с помощью параметра командной строки оболочки -c , и фиксирует результат этого. Он пытается гарантировать, что он не попадает ни в какие псевдонимы оболочки, поэтому он запускает команду env и пытается получить среду, как это было бы для оболочки login , указав ваш также выбрал оболочку параметр командной строки -l .

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

К сожалению, они вызывают интерактивную оболочку таким образом, что оболочки, такие как Z Shell, делают все возможное и пытаются читать ввод в интерактивном режиме. Но Atom не предоставляет им никакого ввода, только конец файла.

Введите параметры ignoreeof оболочки Z Shell и Bourne Again в качестве финального элемента этой комедии.Эти параметры означают, что оболочки продолжают попытки прочитать ввод, даже если они получают конец файла на стандартном вводе. Они делают это довольно жестко. Отсюда и загрузка ЦП.

Дополнительная литература

9
27.01.2020, 21:10

Теги

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