Як пришвидшити час завантаження нового вкладки терміналів?


93

Як я можу пришвидшити запуск терміналу в Леві?

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

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

Наразі, коли я відкриваю нову вкладку, потрібно тривати 3-4 секунди, поки я можу щось запустити.


2
Можливо, у вашій системі щось інше не так? Це не повинно бути таким повільним. Іноді це займає секунду чи дві для мене, але зазвичай це лише частку секунди. І у мене ярмарок трохи .bash_profile(теж перевіряю ~/.profileдо речі). Також: зауважте, що ви можете почати вводити текст під час завантаження bash, і зазвичай те, що ви вводите, буде скопійовано в командний рядок, як тільки воно буде готове.
Abhi Beckert

Використовуєте обліковий запис мережі чи домашній каталог мережі? Чи Термінал реагує на вхід користувача під час створення терміналу? Чи відображає обертовий курсор зайнято?
Кріс Пейдж

1
Щоб дізнатися, де термінал проводить час, відкрийте Монітор активності, виберіть Термінал і натисніть кнопку Панелі інструментів «Зразковий процес», а потім негайно перейдіть до Терміналу та створіть нове вікно / вкладку. Зразок може дати зрозуміти, куди йде час. Також перегляньте список процесів у "Моніторі діяльності": якщо "вхід" або "баш" (або будь-яка оболонка, яку ви використовуєте) з'являються в списку під час затримки, це означає, що затримка, ймовірно, має місце в одній із цих двох програм, а не Термінал.
Кріс Пейдж

Ви перевірили змінну PATH? Я помітив, що мій був безглуздо довгим з багатьма повторами через деякі заплутані дії .bashrc. Я видалив повторення і все швидко прискорилося!
190290000 Рубльова людина

Відповіді:


93

Коротка відповідь:

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

Щоб вирішити проблему, налаштуйте Terminal для запуску нестандартної оболонки:

  1. Створіть символьне посилання на бажану оболонку. Наприклад:sudo ln -s /bin/bash /usr/local/bin/bash
  2. Відкрийте налаштування терміналу та виберіть вкладку "Загальні".
  3. Виберіть "Оболонки відкриті за допомогою: Command" та введіть символьне посилання, яке ви створили на кроці 1. Наприклад, "/ usr / local / bin / bash".

Примітка 1. Можливо, вам також знадобиться додати bashі -bashдо списку процесів у розділі "Налаштування терміналів> Профілі> Оболонка> Запитати перед закриттям".

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

Щоб перевірити виправлення:

  • Відкрийте нове вікно терміналу.
  • "Останній вхід:" не повинен відображатися вгорі
  • Відкрийте інспектор (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).

Як виявляється, Terminal передасть -qпараметр, /usr/bin/loginколи він налаштований на використання нестандартної оболонки. (Помилка 4)

-qПараметр , що нам потрібно , щоб уникнути цієї проблеми, звідси і символічна посилання /usr/local/bin/bash.


6
Чи знаєте ви, чому -q додається, якщо команда є символьним посиланням на / bin / bash, але ні, якщо це / bin / bash?
Лрі

3
@LauriRanta Схоже, це помилка в терміналах 10,7 та 10,8. Якщо встановлена ​​команда запуску, /bin/bashвона поводиться так, ніби вибрана оболонка входу за замовчуванням. Будь-яка команда, окрім як /bin/bashбуде працювати правильно, тому використання / usr / bin / bash - це лише обхідне рішення. Цього клопа немає у Snow Leopard.
Даррен

5
@Darren Ви повідомляли про цю підозру про помилку Apple? Якщо ні, будь ласка, можете це зробити через: bugreport.apple.com
Грем Мілн

3
На жаль, це призводить до повідомлення про те, що баш працює під час кожного закриття терміналу на Йосеміті. Тож не приємне виправлення :(
Клаус Йоргенсен

2
@ ClausJørgensen Я не відчував цієї проблеми. Ви можете перевірити налаштування "Оболонки" на вкладці "Профілі".
Даррен

20

Мені потрібно було змінити з оболонки входу на команду /bin/bash -il в Налаштуваннях iTerm > Профілі> Загальне> Команда .

Мені була потрібна опція -l( Зробити bash діяти так, ніби вона викликана як оболонка для входу ), додана для того, щоб встановити змінні середовища з~/.bash_profile


Що зупиняє пошук входу в ASL відповідно до прийнятого питання
user151019

4
з усіх рішень цей працював для мене. +50!
Бхавін Доші

1
Чудова інформація про все навколо у цій темі! Це рішення, яке я використав, оскільки не вимагало створення символьних посилань чи нічого. Моє нове час запуску оболонки з цим рішенням пішло від ~ 5-10 секунд до моменту.
ДастінБ

16

.hushlogin

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

.hushloginФайл можна створити в Terminal.app, використовуючи таку команду:

touch ~/.hushlogin

Файл набирає чинності негайно.

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

Припинення процесу входу

Створюючи нову вкладку Термінал, ви проходите процес входу. Процес включає отримання різної інформації про попередній сеанс входу, повідомлення дня та відображення системних повідомлень. Це може стати джерелом значних затримок. Спробуйте приглушити ці повідомлення, щоб побачити, чи затримка зникає.


6
.hushlogin насправді не вирішує проблему. Це можна підтвердити за допомогою opensnoop. Дивіться мою відповідь нижче.
Даррен

1
@Darrren: логін вказує мені: -q Це примушує тихі реєстрації, наче присутній .hushlogin. Варіант q - це те, що ви говорите, запобігає проблемі, але це так само, як і при hushlogin.
Крістіан

8

Гаразд, я маю подібний висновок у Даррена, хоча дещо інший механізм профілювання (NB повільний вхід все ще може відбуватися в Йосеміті).

Ось спосіб , щоб сказати , що насправді працює , коли ви починаєте нове вікно входу в систему , використовуючи OS X зразок команди Профілювальники.

Дізнайтеся, яку команду виконує звичайний вхід для входу

$ ps -ef | grep login

Ви побачите щось подібне login -pfl username /bin/bash -c exec -la bash /bin/bash

Створіть ім'я файлу сценарію profile_login.shз наступним вмістом, додавши a

-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що, як видається, відкриває пам’ятки авторизованих зображень

+   ! 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файли недостатньо. Завантаження пам’яті набагато дорожче на моїй машині, у будь-якому випадку [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" для входу. Мабуть, цей параметр пропускає як завантаження пам модулів, так і пошук останнього часу входу (обидва правопорушника). Згідно з документами loginкоманди, торкання ~/.hushloginфайлу має робити те саме, але, мабуть, це більше не працює [принаймні для мене з 10.10].

Отже, підсумовуючи, видалення /private/var/log/asl/*.asl недостатньо (у моєму експерименті це становило не менше 1/3 фактичного уповільнення, хоча, якщо у вас там були мур-файли, це могло б врахувати на більший відсоток я впевнений).

У будь-якому випадку, використовуючи подібні сценарії, ви маєте змогу розповісти про те, що змушує ваш локальний апарат занепасти, і побачити, чи стосується вищезгаданого виправлення. Сміливо коментуйте тут.

ОНОВЛЕННЯ: здається, що це coresymbolication_load_imageможе зайняти багато часу, навіть коли ви login -pfqlвикликаєте (мабуть, якийсь модуль автентифікації пам або інший потребує "набору" на центральний сервер входу або якийсь непарний, тому доводиться чекати відповіді від третьої сторони ). Отже, єдиний реальний спосіб, який я знайшов, - це використовувати iTerm2 і /bin/bashзамість цього змінити налаштування -> профілі -> загальні -> Команда .


1
Окрім пошуку ASL, затримки входу в систему найчастіше спричинені тим, що ви знаходитесь у мережі з сервером каталогів, який повільно реагує на запит вашої інформації про користувача. Якщо ви не в мережі з увімкненими службами каталогів, я не знаю, на що ще знадобиться значне час, крім загальної перевантаженості системи (використання процесора, тиск пам'яті, перевантаження вводу / виводу).
Кріс Пейдж

@ChrisPage Так, мабуть, деякі сервіси мережевих каталогів щось чи інше, хороша порада.
rogerdpack

3

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

Особисто я помічаю лише затримку між активацією та деактивацією додатку та на першій вкладці, створеній після періоду активності. Завжди змушує мене думати, що мова йде про сторінки пам'яті, які переміщуються.


2

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


2

У моєму випадку, випробувавши вище на своїй робочій машині без успіху, я виявив, що винуватцем була Active Directory. Виправлення полягало в тому, щоб увійти в службову службу каталогу та відредагувати налаштування служби AD (двічі клацніть на "Активний каталог"), щоб увімкнути "Створити мобільний рахунок при вході":

скріншот програми Directory Utility з налаштуваннями Active Directory відкрито

Очевидно, це спричиняє кешування даних облікових даних AD локально, тому системі більше не потрібно виходити на сервер щоразу, коли вона намагається перевірити ваш пароль.

Ви можете дістатися до утиліти Directory за допомогою прожектора або через розділ "Параметри входу" у розділі "Налаштування системи / Користувачі та групи" (натисніть кнопку "Редагувати ..." поруч із "Сервер мережевих облікових записів":

На панелі "Користувачі та групи" відображаються "Параметри входу" та "Редагувати ..."


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

Проблема для мене полягала в тому, що сервер домену активного каталогу був недійсним.

Змінивши його, потім перезавантажте комп'ютер, зафіксувавши його.

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.