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/*.asl
co 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ć.
macos
terminal
command-line
Fernando
źródło
źródło
.bash_profile
(sprawdź także~/.profile
przy 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.Odpowiedzi:
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:
sudo ln -s /bin/bash /usr/local/bin/bash
Uwaga 1: Może być również konieczne dodanie
bash
i-bash
do listy procesów w „Preferencjach terminala> Profile> Shell> Pytaj przed zamknięciem”.Uwaga 2:
/usr/local/bin
można zapisywać w trybie bez rootowania OS X 10.11 (El Capitan).Aby zweryfikować poprawkę:
login -pfq username /usr/bin/bash
lublogin -pfql username ...
Ważne: jeśli polecenie logowania nie zawiera
-q
parametru, 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/asl
nie 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
-q
parametru do/usr/bin/login
..hushlogin
Plik 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/login
do 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
-q
parametr,/usr/bin/login
gdy zostanie skonfigurowany do używania niestandardowej powłoki. (Bug 4)Ten
-q
parametr jest tym, czego potrzebujemy, aby uniknąć problemu, stąd dowiązanie symboliczne/usr/local/bin/bash
.źródło
/bin/bash
zachowuje się tak, jakby wybrano Domyślną powłokę logowania. Każde polecenie inne niż/bin/bash
bę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.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
źródło
.hushlogin
Utwórz pusty plik w folderze domowym o nazwie
.hushlogin
; znacznie zmniejszy to czas wyświetlania karty Terminal.app.Możesz utworzyć
.hushlogin
plik w Terminal.app za pomocą następującego polecenia:Plik zacznie obowiązywać natychmiast.
Możesz dowiedzieć się więcej na temat
.hushlogin
pliku 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.
źródło
opensnoop
. Zobacz moją odpowiedź poniżej.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
Zobaczysz coś takiego
login -pfl username /bin/bash -c exec -la bash /bin/bash
Utwórz nazwę pliku skryptu
profile_login.sh
o 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:
Zrób to
$ chmod u+x profile_login.sh
i uruchom go używając sudo (
sample
polecenie tego wymaga)$ sudo ./profile_login.sh
OK, więc idź i uruchom. Na przykład
purge
najpierw 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_start
się otwieraniem obrazów pam auth liba czasem pojawia się inny przestępca
getlastlogxbyname
Zasadniczo są więc dwaj przestępcy. Jednym z nich jest
pam
(pewien rodzaj systemu uwierzytelniania), a drugim jest toasl
„wykryj swój najnowszy login”. Więc najwyraźniej samo usunięcie/private/var/log/asl/*.asl
plikó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_dynamicJeś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:
Więc jeśli teraz użyję tej samej
sample
sztuczki w nowym poleceniu logowaniagenerowany jest znacznie mniejszy ślad stosu, przy czym największym przestępcą jest:
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ą
login
polecenia, dotknięcie~/.hushlogin
pliku 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_image
nadal może to zająć mnóstwo czasu, nawet gdylogin -pfql
zostanie 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
.źródło
Chodzi o zbadanie przyczyny. Możesz zobaczyć, co się dzieje na początku procesu, wprowadzając dane,
bash -x
któ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.
źródło
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.
źródło
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”:
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”):
źródło
Po prostu biegnij:
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:
Spowoduje to wydrukowanie wszystkich twoich danych, które mają miejsce podczas ładowania karty.
źródło
Otwórz
/etc/profile
i dodaj linię,PATH=""
aby wyglądała następująco:źródło
Problemem było to, że serwer domeny Active Directory był nieprawidłowy.
Zmieniając to, a następnie ponownie uruchamiając Mac naprawiłem.
źródło