Jak przyspieszyć ładowanie nowej karty Terminal?

93

Jak mogę przyspieszyć uruchamianie terminalu w Lion?

Nie odnoszę się do uruchamiania aplikacji Terminal, ale do okien terminalu uruchamiania, na przykład kiedy otwieram nową kartę.

Nie mam nic w moim pliku .bash_profile i uruchamiam rm -rf /private/var/log/asl/*.aslco 4 godziny (co powoduje wyczyszczenie plików, które zwykle spowalniają terminal).

Obecnie, kiedy otwieram nową kartę, zajmuje mi to 3-4 sekundy, zanim mogę coś uruchomić.

Fernando
źródło
2
Być może coś jest nie tak z twoim systemem? Nie powinno być tak wolno. Czasami zajmuje mi to sekundę lub dwie, ale zwykle jest to ułamek sekundy. I mam sporo w .bash_profile(sprawdź także ~/.profileprzy okazji). Ponadto: pamiętaj, że możesz zacząć pisać podczas ładowania bash, a zwykle to, co wpisujesz, zostanie skopiowane do wiersza polecenia, gdy będzie gotowe.
Abhi Beckert
Czy korzystasz z konta sieciowego lub sieciowego katalogu domowego? Czy terminal reaguje na dane wejściowe użytkownika podczas jego tworzenia? Czy wyświetla kursor zajęty?
Chris Page
1
Aby dowiedzieć się, gdzie Terminal spędza czas, otwórz Monitor aktywności, wybierz Terminal i kliknij przycisk paska narzędzi Przykładowy proces, a następnie natychmiast przejdź do Terminal i utwórz nowe okno / kartę. Próbka może dostarczyć wskazówek, gdzie zmierza czas. Zobacz także listę procesów w monitorze aktywności: jeśli „login” lub „bash” (lub cokolwiek, której używasz) pojawi się na liście podczas opóźnienia, oznacza to, że opóźnienie może wystąpić w jednym z tych dwóch programów, a nie Terminal.
Chris Page
Czy sprawdziłeś zmienną PATH? Zauważyłem, że mój był absurdalnie długi z wieloma powtórzeniami z powodu pewnych mylących wydarzeń .bashrc. Usunąłem powtórzenia i wszystko przyspieszyło!
190290000 Rubel Man

Odpowiedzi:

93

Krótka odpowiedź:

Przyczyną problemu jest (potencjalnie) kosztowne wyszukiwanie dziennika systemu ASL. Aby zobaczyć to w akcji, uruchom sudo fs_usage | grep 'asl.*login'w oknie Terminal, a następnie otwórz nowe okno Terminal.

Aby rozwiązać problem, skonfiguruj Terminal do uruchamiania niestandardowej powłoki:

  1. Utwórz dowiązanie symboliczne do preferowanej powłoki. Na przykład:sudo ln -s /bin/bash /usr/local/bin/bash
  2. Otwórz Preferencje terminala i wybierz kartę „Ogólne”.
  3. Wybierz „Otwarte powłoki za pomocą: Command” i wprowadź dowiązanie symboliczne utworzone w kroku 1. Np. „/ Usr / local / bin / bash”.

Uwaga 1: Może być również konieczne dodanie bashi -bashdo listy procesów w „Preferencjach terminala> Profile> Shell> Pytaj przed zamknięciem”.

Uwaga 2: /usr/local/binmożna zapisywać w trybie bez rootowania OS X 10.11 (El Capitan).

Aby zweryfikować poprawkę:

  • Otwórz nowe okno terminala.
  • „Ostatnie logowanie:” nie powinno być wyświetlane u góry
  • Otwórz inspektora (Command + I) i wybierz kartę Informacje.
  • Polecenie powinno brzmieć login -pfq username /usr/bin/bashlublogin -pfql username ...

Ważne: jeśli polecenie logowania nie zawiera -qparametru, oznacza to, że problem nie został rozwiązany.

Możesz także użyć sudo fs_usage | grep 'asl.*login'do sprawdzenia, czy /var/log/aslnie jest otwierane podczas otwierania nowego okna terminala.

Detale:

W grze jest wiele błędów.

Rzeczywista przyczyna spowolnienia jest taka /usr/bin/login, że domyślnie wyświetlana jest data ostatniego logowania. Aby uzyskać datę ostatniego logowania, przeszukuje bazę danych ASL (Apple System Log) pod adresem /var/log/asl/. Te pliki dziennika mogą być bardzo mocno pofragmentowane i to właśnie fragmentacja plików powoduje opóźnienie przy otwieraniu nowego okna lub karty. (Bug 1)

Jedynym sposobem na powstrzymanie wyszukiwania ASL dla ostatniego logowania jest przekazanie -qparametru do /usr/bin/login. .hushloginPlik będzie również wyłączyć wyświetlanie „last login”, ale to nie eliminuje kosztowną przeszukiwanie ASL. (Bug 2)

Terminal zawsze używa /usr/bin/logindo uruchomienia każdego nowego okna / powłoki. Nie ma opcji bezpośredniego uruchomienia powłoki, ani nie ma sposobu na bezpośrednią kontrolę parametrów przekazywanych do /usr/bin/login(Bug 3).

Jak się okazuje, Terminal przekaże -qparametr, /usr/bin/logingdy zostanie skonfigurowany do używania niestandardowej powłoki. (Bug 4)

Ten -qparametr jest tym, czego potrzebujemy, aby uniknąć problemu, stąd dowiązanie symboliczne /usr/local/bin/bash.

Darren
źródło
6
Czy wiesz, dlaczego dodano -q, jeśli polecenie jest dowiązaniem symbolicznym do / bin / bash, ale nie, jeśli jest to / bin / bash?
Lri,
3
@LauriRanta Wygląda na to, że jest to błąd w terminalu 10.7 i 10.8. Po ustawieniu polecenia uruchamiania /bin/bashzachowuje się tak, jakby wybrano Domyślną powłokę logowania. Każde polecenie inne niż /bin/bashbędzie działać poprawnie, więc użycie / usr / bin / bash to tylko obejście. Ten błąd nie występuje w systemie Snow Leopard.
Darren,
5
@Darren, czy zgłosiłeś ten podejrzany błąd do Apple? Jeśli nie, można to zrobić poprzez: bugreport.apple.com
Graham Miln
3
Niestety, skutkuje to promowaniem bashu za każdym razem, gdy zamykasz terminal na Yosemite. Więc niezbyt fajna poprawka :(
Claus Jørgensen
2
@ ClausJørgensen Nie spotkałem się z tym problemem. Możesz sprawdzić ustawienia „Powłoki” w zakładce Profile.
Darren
20

Potrzebowałem zmiany z powłoki logowania na komendę /bin/bash -il w Preferencjach iTerm > Profile> Ogólne> Polecenie .

Potrzebowałem opcji -l( Spraw, aby bash działał tak, jakby był wywoływany jako powłoka logowania ), aby ustawić zmienne środowiskowe z~/.bash_profile

butcheriftexas
źródło
Co zatrzymuje wyszukiwanie logowania ASL zgodnie z zaakceptowanym pytaniem
użytkownik151019
4
ze wszystkich rozwiązań, to zadziałało dla mnie. +50!
Bhavin Doshi
1
Świetne informacje dookoła w tym wątku! To jest rozwiązanie, którego użyłem, ponieważ nie wymagało tworzenia dowiązań symbolicznych ani nic takiego. Dzięki temu rozwiązaniu moje nowe czasy uruchamiania powłoki wzrosły z ~ 5-10 sekund do natychmiastowych.
DustinB
16

.hushlogin

Utwórz pusty plik w folderze domowym o nazwie .hushlogin; znacznie zmniejszy to czas wyświetlania karty Terminal.app.

Możesz utworzyć .hushloginplik w Terminal.app za pomocą następującego polecenia:

touch ~/.hushlogin

Plik zacznie obowiązywać natychmiast.

Możesz dowiedzieć się więcej na temat .hushloginpliku i ogólnie procesu logowania w instrukcji logowania .

Cichy proces logowania

Po utworzeniu nowej karty Terminal przechodzi proces logowania. Proces ten obejmuje pobieranie różnych informacji o poprzedniej sesji logowania, wiadomości dnia i wyświetlanie komunikatów systemowych. Może to być przyczyną znacznych opóźnień. Spróbuj ukryć te wiadomości, aby zobaczyć, czy opóźnienie zniknie.

Graham Miln
źródło
6
.hushlogin nie rozwiązuje problemu. Można to potwierdzić za pomocą opensnoop. Zobacz moją odpowiedź poniżej.
Darren,
1
@Darrren: login man mówi mi: -q Wymusza ciche logowanie, tak jakby obecny był .hushlogin. Mówi się, że opcja q zapobiega problemowi, ale robi to tak samo, jak w przypadku hushlogin.
Christian
8

OK Mam podobny wniosek do Darrena, choć nieco inny mechanizm profilowania (w Yosemite nadal może wystąpić powolne logowanie).

Oto sposób, aby powiedzieć, co faktycznie działa po uruchomieniu nowego okna logowania, za pomocą przykładowego polecenia profilera w OS X.

Dowiedz się, jakie polecenie wykonuje normalne logowanie

$ ps -ef | grep login

Zobaczysz coś takiego login -pfl username /bin/bash -c exec -la bash /bin/bash

Utwórz nazwę pliku skryptu profile_login.sho następującej treści, dodając

-c ""

na końcu odkrytego polecenia, aby zażądać natychmiastowego powrotu bash, z treściami takimi jak to:

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

Zrób to

$ chmod u+x profile_login.sh

i uruchom go używając sudo ( samplepolecenie tego wymaga)

$ sudo ./profile_login.sh

OK, więc idź i uruchom. Na przykład purgenajpierw wykonując polecenie. Na moim pudełku mam duży wykres wyjściowy. Szukając „najliczniejszych gałęzi” (zazwyczaj na górze) widziałem dwóch największych przestępców :

Jeden z czegoś, co nazywa pam_startsię otwieraniem obrazów pam auth lib

+   ! 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]

a czasem pojawia się inny przestępca 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]

Zasadniczo są więc dwaj przestępcy. Jednym z nich jest pam(pewien rodzaj systemu uwierzytelniania), a drugim jest to asl„wykryj swój najnowszy login”. Więc najwyraźniej samo usunięcie /private/var/log/asl/*.aslplików nie wystarczy. W każdym razie ładowanie pam jest znacznie droższe na moim komputerze [SSD]. Uruchom powyższy skrypt i sprawdź, czy Twój system jest taki sam. Co ciekawe, kod źródłowy tych wywołań metod wydaje się być dostępny również online, na przykład openpam_dynamic

Jeśli podążę za odpowiedzią Darrena i zastąpię moje „otwarte powłoki” preferencją inną niż / bin / bash, wtedy zobaczę następujące wiersze użyte do uruchomienia nowych kart terminalu:

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

Więc jeśli teraz użyję tej samej samplesztuczki w nowym poleceniu logowania

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

generowany jest znacznie mniejszy ślad stosu, przy czym największym przestępcą jest:

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

Myślę, że dzieje się tak, ponieważ teraz używany jest parametr logowania „-q”. Najwyraźniej ten parametr pomija zarówno ładowanie modułów pam, jak i wyszukiwanie czasu ostatniego logowania (obaj przestępcy). Zgodnie z dokumentacją loginpolecenia, dotknięcie ~/.hushloginpliku powinno zrobić to samo, ale najwyraźniej to już nie działa [przynajmniej dla mnie z 10.10].

Podsumowując, usunięcie /private/var/log/asl/*.asl nie wystarcza (w moim eksperymencie stanowiło to najwyżej 1/3 faktycznego spowolnienia, chociaż gdybyś miał tam pliki obyczajów, mógłby to uwzględnić dla większego procentu jestem pewien).

W każdym razie przy użyciu podobnych skryptów powinieneś być w stanie powiedzieć, co powoduje, że twoja lokalna maszyna się zapadła i sprawdzić, czy powyższa poprawka dotyczy ciebie. Skomentuj tutaj.

AKTUALIZACJA: wydaje się, że coresymbolication_load_imagenadal może to zająć mnóstwo czasu, nawet gdy login -pfqlzostanie wywołane (prawdopodobnie jakiś moduł uwierzytelniania pam lub inny musi „wybrać numer” do centralnego serwera logowania lub jakiś dziwny, więc musi poczekać na odpowiedź od strony trzeciej ). Tak więc jedynym prawdziwym obejściem, jakie znalazłem, jest użycie iTerm2 i zmiana preferencji -> profile -> ogólne -> Polecenie na /bin/bash.

rogerdpack
źródło
1
Oprócz wyszukiwania ASL opóźnienia w logowaniu są najczęściej spowodowane przebywaniem w sieci z serwerem katalogowym, który reaguje powoli, gdy zostanie poproszony o podanie informacji o użytkowniku. Jeśli nie jesteś w sieci z włączonymi usługami katalogowymi, to nie wiem, co zajęłoby dużo czasu, oprócz ogólnego przeciążenia systemu (użycie procesora, ciśnienie pamięci, przeciążenie we / wy).
Chris Page
@ChrisPage Tak, pewnie jakieś sieciowe usługi katalogowe, czy jakaś dobra wskazówka.
rogerdpack,
3

Chodzi o zbadanie przyczyny. Możesz zobaczyć, co się dzieje na początku procesu, wprowadzając dane, bash -xktóre wydrukują proces uruchamiania powłoki.

Osobiście zauważam jedynie opóźnienie między aktywacją i dezaktywacją aplikacji oraz w pierwszej zakładce utworzonej po pewnym okresie aktywności. Zawsze sprawia, że ​​myślę, że chodzi o przenoszenie stron pamięci.

ismail
źródło
2

Zmniejsz swoją historię do około 4–10 tysięcy linii i być może spróbuj zamknąć i odrzucić wszystkie zapisane okna. Widziałem, że oba robią różnicę na wolniejszych maszynach - szczególnie tych bez SSD do przechowywania.

bmike
źródło
2

W moim przypadku, po wypróbowaniu powyższego na moim komputerze roboczym bez powodzenia, stwierdziłem, że winowajcą była Active Directory. Rozwiązaniem było przejście do Directory Utility i edycja ustawień usługi AD (dwukrotne kliknięcie „Active Directory”), aby włączyć opcję „Utwórz konto mobilne przy logowaniu”:

zrzut ekranu aplikacji Directory Utility z otwartymi ustawieniami Active Directory

To najwyraźniej powoduje, że poświadczenia AD są buforowane lokalnie, więc system nie musi już wychodzić na serwer za każdym razem, gdy próbuje zweryfikować twoje hasło.

Możesz przejść do Directory Utility z Spotlight lub poprzez sekcję „Opcje logowania” w Preferencjach systemowych / Użytkownicy i grupy (wybierz przycisk „Edytuj…” obok „Serwer kont sieciowych”):

Panel Użytkownicy i grupy zawierający „Opcje logowania” i „Edytuj…”

David Moles
źródło
0

Po prostu biegnij:

sudo creatbyproc.d
sudo newproc.d

w oddzielnych terminalach i otwórz nowy open, aby zobaczyć, co jest wykonywane w tym czasie.

Jeśli nic nie jest oczywiste, spróbuj wykonać następujące czynności:

sudo dtruss -an Terminal

Spowoduje to wydrukowanie wszystkich twoich danych, które mają miejsce podczas ładowania karty.

kenorb
źródło
0

Otwórz /etc/profilei dodaj linię, PATH=""aby wyglądała następująco:

if [ -x /usr/libexec/path_helper ]; then
    PATH=""
    eval `/usr/libexec/path_helper -s`
fi
Davidcondrey
źródło
0

Problemem było to, że serwer domeny Active Directory był nieprawidłowy.

Zmieniając to, a następnie ponownie uruchamiając Mac naprawiłem.

wprowadź opis zdjęcia tutaj

użytkownik2707671
źródło