Как ускорить загрузку новой вкладки «Терминал»?


85

Как я могу ускорить запуск терминала в Lion?

Я имею в виду не запуск приложения терминала, а окна запуска терминала, например, когда я открываю новую вкладку.

У меня ничего нет в моем .bash_profile файл и я бегу rm -rf /private/var/log/asl/*.asl каждые 4 часа (которые очищают те файлы, которые обычно делают терминал медленным).

В настоящее время, когда я открываю новую вкладку, я могу запустить что-то за 3-4 секунды.


2
Возможно, что-то не так с вашей системой? Это не должно быть так медленно. Иногда это занимает секунду или две для меня, но обычно это всего лишь доля секунды. И у меня есть немало .bash_profile (также проверьте ~/.profile Кстати). Также: обратите внимание, что вы можете начать печатать во время загрузки bash, и обычно то, что вы вводите, будет скопировано в командную строку, как только оно будет готово.
— Abhi Beckert

Вы используете сетевую учетную запись или домашний каталог сети? Терминал реагирует на ввод пользователя при создании терминала? Отображает ли он вращающийся занятый курсор?
— Chris Page

1
Чтобы узнать, где терминал тратит время, откройте «Монитор активности», выберите «Терминал» и нажмите кнопку на панели инструментов «Образец процесса», затем сразу перейдите в «Терминал» и создайте новое окно / вкладку. Образец может дать подсказку о том, куда идет время. Кроме того, просмотрите список процессов в Activity Monitor: если во время задержки в списке появляются «логин» или «bash» (или какая-либо используемая вами оболочка), это означает, что задержка, вероятно, происходит в одной из этих двух программ, а не Терминал.
— Chris Page

Вы проверили свою переменную PATH? Я заметил, что мой был абсурдно длинным со многими повторениями из-за некоторых запутанных изменений .bashrc. Я удалил повторы, и все ускорилось!
— 190290000 Ruble Man

Ответы:


85

Короткий ответ:

Проблема вызвана (потенциально) дорогим поиском системного журнала ASL. Чтобы увидеть это в действии, запустите sudo fs_usage | grep 'asl.*login' в окне терминала, затем откройте новое окно терминала.

Чтобы решить проблему, настройте Терминал для запуска нестандартной оболочки:

  1. Создайте символическую ссылку на предпочитаемую вами оболочку. Например.: sudo ln -s /bin/bash /usr/local/bin/bash
  2. Откройте настройки терминала и выберите вкладку «Общие».
  3. Выберите «Оболочки, открытые с помощью: Command» и введите символическую ссылку, созданную на шаге 1. Например "/ USR / местные / бен / Баш".

Примечание 1: Вам также может понадобиться добавить bash а также -bash к списку процессов в «Настройки терминала & gt; Профили & gt; Спросить перед закрытием».

Заметка 2: /usr/local/bin доступен для записи в OS X 10.11 (El Capitan) в режиме Rootless.

Чтобы проверить исправление:

  • Откройте новое окно терминала.
  • "Последний логин:" должен не отображаться вверху
  • Откройте инспектор (Command + I) и выберите вкладку «Информация».
  • Команда должна прочитать login -pfq username /usr/bin/bash или же login -pfql username ...

Важно: если команда входа в систему не включает -q Параметр, то вы не исправили проблему.

Вы также можете использовать sudo fs_usage | grep 'asl.*login' чтобы проверить это /var/log/asl не открывается при открытии нового окна терминала.

Подробности:

Здесь есть ряд ошибок.

Фактическая причина медлительности /usr/bin/login, который по умолчанию будет отображать дату вашего последнего входа в систему. Чтобы получить эту последнюю дату входа в систему, она выполняет поиск в базе данных ASL (Apple System Log) по адресу /var/log/asl/, Эти файлы журналов могут быть очень сильно фрагментированы, и именно эта фрагментация файлов вызывает задержку при открытии нового окна или вкладки. (Ошибка 1)

Единственный способ подавить поиск ASL для последнего входа в систему - передать -q параметр для /usr/bin/login, .hushlogin Файл также подавляет отображение «Последний вход в систему», но он не подавляет дорогой поиск ASL. (Ошибка 2)

Терминал всегда использует /usr/bin/login запускать каждое новое окно / оболочку. Нет возможности напрямую запустить оболочку и нет способа напрямую управлять параметрами, передаваемыми в /usr/bin/login (Ошибка 3).

Оказывается, Терминал пройдет -q параметр для /usr/bin/login когда он настроен на использование нестандартный ракушка. (Ошибка 4)

-q Параметр - это то, что нам нужно, чтобы избежать проблемы, поэтому ссылка на /usr/local/bin/bash,


6
Знаете ли вы, почему -q добавляется, если команда является символической ссылкой на / bin / bash, а не если это / bin / bash?
— Lri

3
@LauriRanta Кажется, это ошибка в терминале 10.7 и 10.8. Когда команда запуска установлена ​​на /bin/bash он ведет себя так, как будто была выбрана оболочка входа по умолчанию. Любая команда, кроме /bin/bash будет работать правильно, поэтому использование / usr / bin / bash - это просто обходной путь. Эта ошибка отсутствует в Snow Leopard.
— Darren

5
@Darren Вы сообщили об этой подозрительной ошибке в Apple? Если нет, пожалуйста, не могли бы вы сделать это через: bugreport.apple.com
— Graham Miln

3
К сожалению, это приводит к тому, что bash запускается каждый раз, когда вы закрываете терминал в Yosemite. Так что не очень хорошее решение :(
— Claus Jørgensen

2
@ ClausJørgensen Я не испытывал этой проблемы. Вы можете проверить настройки «Оболочки» на вкладке «Профили».
— Darren

16

Что мне было нужно, так это переходить из командной оболочки в команду /bin/bash -il в iTerm Настройки & gt; Профили & gt; Общие & gt; команда ,

Мне нужна была опция -l ( Сделайте так, чтобы bash действовал так, как если бы он был вызван как оболочка входа ) добавлен для того, чтобы установить переменные среды из ~/.bash_profile


Который останавливает поиск логина ASL согласно принятому вопросу
— Mark

3
из всех решений это сработало для меня. +50!
— Bhavin Doshi

1
Отличная информация вокруг в этой теме! Это решение, которое я использовал, потому что оно не требовало создания символических ссылок или чего-либо еще. С этим решением время запуска новой оболочки увеличилось с ~ 5 до 10 секунд.
— DustinB

14

.hushlogin

Создайте пустой файл в вашей домашней папке с именем .hushlogin; это значительно сократит время, необходимое для появления вкладки Terminal.app.

Вы можете создать .hushlogin файл в Terminal.app с помощью следующей команды:

touch ~/.hushlogin

Файл вступит в силу немедленно.

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

Успокоение процесса входа

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


6
.hushlogin на самом деле не решает проблему. Это можно подтвердить с помощью opensnoop, Смотрите мой ответ ниже.
— Darren

1
@Darrren: man login сообщает мне: -q Это вызывает тихий вход в систему, как если бы присутствовал .hushlogin. Опция q, как вы говорите, предотвращает проблему, но она делает то же самое, что и hushlogin.
— Christian

5

Хорошо, у меня есть вывод, подобный Даррену, хотя немного другой механизм профилирования (медленный вход в систему все еще может происходить в Йосемити)

Вот способ сказать какие на самом деле работает, когда вы запускаете новое окно входа в систему, используя OS X образец Команда профилировщика.

Узнайте, какую команду выполняет обычный логин

$ ps -ef | grep login

Вы увидите что-то вроде login -pfl username /bin/bash -c exec -la bash /bin/bash

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

-c ""

до конца обнаруженной команды запросить немедленный возврат bash с таким содержимым:

login -pfl username /bin/bash -c exec -la bash /bin/bash -c "" &
sudo sample $! -mayDie # sample the above command

Сделайте это исполняемым

$ chmod u+x profile_login.sh

и запустить его с помощью sudo ( sample это требует команда)

$ sudo ./profile_login.sh

Хорошо, так что давай и запустить его. Например, выполнив purge Команда первая. На моем ящике я получил большой график вывода. В поисках «самых больших пронумерованных ветвей» (обычно вверху) я увидел следующие два самые большие преступники :

Один из того, что называется pam_start который появляется при открытии pam auth lib images

+   ! 1068 pam_start  (in libpam.2.dylib) + 132  [0x7fff97295ab0]
+   !    :   1066 openpam_dynamic  (in libpam.2.dylib) + 120  [0x7fff97293d14]
+   !    :   |   +   !   1042 coresymbolication_load_image(CSCppDyldSharedMemoryPage*, ImageLoader const*, unsigned long long)  (in dyld) + 143  [0x7fff66725411]
+   !    :   |   +   !   :     1042 mach_msg_trap  (in dyld) + 10  [0x7fff6674a472]

и это иногда сопровождается другим преступником getlastlogxbyname

+   ! 583 getlastlogxbyname  (in libsystem_c.dylib) + 212  [0x7fff92b3ef7a]
+   !       : 566 asl_file_open_read  (in libsystem_asl.dylib) + 143  [0x7fff8c27030d]
+   !       : | 566 __open_nocancel  (in libsystem_kernel.dylib) + 10  [0x7fff97b39012]    +   !       : | 566 __open_nocancel  (in libsystem_kernel.dylib) + 10  [0x7fff97b39012]

Таким образом, в основном, есть два преступника. Один pam (некоторый тип системы аутентификации), а другой - asl «определить ваш последний логин». Так видимо просто удаляя /private/var/log/asl/*.asl файлов не достаточно. В любом случае загрузка pam на моей машине намного дороже [SSD]. Не стесняйтесь запустить приведенный выше сценарий и посмотрите, является ли ваша система такой же. Интересно, что исходный код для этих вызовов методов, кажется, также доступен онлайн, например openpam_dynamic

Если я следую ответу Даррена и заменяю мои предпочтения «открытые оболочки» на что-то отличное от / bin / bash, я вижу следующие строки, используемые для запуска новых вкладок терминала:

 $ ps -ef | grep login
  ... login -pfql packrd /bin/bash -c exec -la bash /usr/bin/bash

Так что, если я сейчас использую то же самое sample трюк с новой командой входа в систему

login -pfql username /bin/bash -c exec -la bash /usr/bin/bash -c "" &
sudo sample $! -mayDie

генерируется намного меньшая стековая трасса, самым большим нарушителем которой является:

+         8 pam_end  (in libpam.2.dylib) + 190  [0x7fff97294ebb]
+             !           6 coresymbolication_unload_image(CSCppDyldSharedMemoryPage*, ImageLoader const*)  (in dyld) + 143  [0x7fff6e0f634f]

Я думаю, это потому, что сейчас используется параметр входа в систему "-q". Видимо этот параметр пропускает обе загрузки модулей pam а также поиск последнего времени входа (оба нарушителя). Согласно документам login команда, касаясь ~/.hushlogin Файл должен делать то же самое, но, очевидно, это больше не работает [по крайней мере, для меня с 10.10].

Итак, в итоге, удаление /private/var/log/asl/*.asl недостаточно (в моем эксперименте на него приходилось не более 1/3 фактического замедления, хотя, если бы у вас были файлы mores, на него можно было для большего процента я уверен).

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

ОБНОВЛЕНИЕ: кажется, что coresymbolication_load_image все еще может занять кучу времени, даже когда login -pfql вызывается (предположительно, какой-то модуль аутентификации pam или другой должен «дозвониться» до центрального сервера входа в систему или какой-то другой, поэтому должен ждать ответа от третьей стороны). Так что единственное реальный Обходное решение, которое я нашел, - это использовать iTerm2 и изменить настройки - & gt; профили - & gt; общее - & gt; Команда для /bin/bash вместо.


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

@ChrisPage Да, наверное, какие-то сервисы сетевых каталогов так или иначе, хороший совет.
— rogerdpack

2

Это все о расследовании причины. Вы можете увидеть, что делается во время запуска процесса, введя bash -x который распечатает процесс запуска оболочки.

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


2

Уменьшите свою историю до 4-10 тысяч строк и, возможно, попробуйте выйти и отбросить все сохраненные окна. Я видел, как оба имеют значение на медленных машинах - особенно те, которые не имеют SSD для хранения.


1

В моем случае после попытки выше На моей рабочей машине безуспешно я обнаружил, что виновником был Active Directory. Исправление должно было войти в Утилита каталогов и измените настройки службы AD (дважды щелкните «Active Directory»), чтобы включить «Создать учетную запись для мобильных устройств при входе»:

screenshot of Directory Utility application w/Active Directory settings open

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

Вы можете получить доступ к Утилите каталогов с помощью Spotlight или через раздел «Параметры входа» в Системных настройках / Пользователи и amp; Группы (нажмите кнопку «Изменить…» рядом с «Сервер сетевых учетных записей»):

Users & Groups pane showing "Login Options" and "Edit…"


0

Просто беги:

sudo creatbyproc.d
sudo newproc.d

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

Если ничего не очевидно, попробуйте следующее:

sudo dtruss -an Terminal

Это напечатает все ваши данные, которые происходят во время загрузки вкладки.


0

открыто /etc/profile и добавьте строку PATH="" так это выглядит так:

if [ -x /usr/libexec/path_helper ]; then
    PATH=""
    eval `/usr/libexec/path_helper -s`
fi

0

Проблема для меня заключалась в том, что сервер домена Active Directory был недействительным.

Изменение, а затем перезагрузка Mac исправил это.

enter image description here

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.