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

85

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

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

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

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

Fernando
источник
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,

Darren
источник
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

butcheriftexas
источник
Который останавливает поиск логина ASL согласно принятому вопросу
Mark
3
из всех решений это сработало для меня. +50!
Bhavin Doshi
1
Отличная информация вокруг в этой теме! Это решение, которое я использовал, потому что оно не требовало создания символических ссылок или чего-либо еще. С этим решением время запуска новой оболочки увеличилось с ~ 5 до 10 секунд.
DustinB
14

.hushlogin

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

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

touch ~/.hushlogin

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

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

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

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

Graham Miln
источник
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 вместо.

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

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

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

ismail
источник
2

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

bmike
источник
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…"

David Moles
источник
0

Просто беги:

sudo creatbyproc.d
sudo newproc.d

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

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

sudo dtruss -an Terminal

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

kenorb
источник
0

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

if [ -x /usr/libexec/path_helper ]; then
    PATH=""
    eval `/usr/libexec/path_helper -s`
fi
davidcondrey
источник
0

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

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

enter image description here

user2707671
источник