Wie beschleunige ich das Laden der neuen Registerkarte "Terminal"?


93

Wie kann ich den Terminalstart in Lion beschleunigen?

Ich beziehe mich nicht auf den Start der Terminal-Anwendung, sondern auf die Start-Terminal-Fenster, wie wenn ich eine neue Registerkarte öffne.

Ich habe nichts in meiner .bash_profile- Datei und starterm -rf /private/var/log/asl/*.asl alle 4 Stunden (wodurch die Dateien gelöscht werden, die normalerweise das Terminal verlangsamen).

Wenn ich gerade einen neuen Tab öffne, dauert es 3-4 Sekunden, bis ich etwas ausführen kann.


2
Vielleicht stimmt etwas anderes mit Ihrem System nicht? Es sollte nicht so langsam sein. Manchmal dauert es ein oder zwei Sekunden, aber normalerweise ist es nur ein Bruchteil einer Sekunde. Und ich habe einiges zu tun .bash_profile(siehe ~/.profileübrigens auch). Beachten Sie auch, dass Sie mit der Eingabe beginnen können, während die Bash geladen wird. In der Regel wird das, was Sie eingeben, in die Eingabeaufforderung kopiert, sobald es fertig ist.
Abhi Beckert

Verwenden Sie ein Netzwerkkonto oder ein Netzwerk-Basisverzeichnis? Reagiert das Terminal auf Benutzereingaben, während es das Terminal erstellt? Wird der rotierende Besetztzeiger angezeigt?
Chris Seite

1
Um herauszufinden, wo Terminal die Zeit verbringt, öffnen Sie Activity Monitor, wählen Sie Terminal aus und klicken Sie auf die Symbolleistenschaltfläche Sample Process. Wechseln Sie dann sofort zu Terminal und erstellen Sie ein neues Fenster / eine neue Registerkarte. Die Probe kann einen Hinweis darauf geben, wohin die Zeit geht. Beobachten Sie auch die Prozessliste im Aktivitätsmonitor: Wenn während der Verzögerung "login" oder "bash" (oder die von Ihnen verwendete Shell) in der Liste angezeigt wird, bedeutet dies, dass die Verzögerung wahrscheinlich in einem dieser beiden Programme auftritt und nicht Terminal.
Chris Seite

Haben Sie Ihre PATH-Variable überprüft? Mir ist aufgefallen, dass meine Zeit mit vielen Wiederholungen absurd lang war, aufgrund einiger verwirrender .bashrc-Vorgänge. Ich habe die Wiederholungen entfernt und alles beschleunigt!
190290000 Ruble Man

Antworten:


93

Kurze Antwort:

Das Problem wird durch eine (möglicherweise) teure ASL-Systemprotokollsuche verursacht. Um dies in Aktion zu sehen, führen Sie es sudo fs_usage | grep 'asl.*login'in einem Terminalfenster aus und öffnen Sie dann ein neues Terminalfenster.

Um das Problem zu lösen, konfigurieren Sie Terminal so, dass eine nicht standardmäßige Shell gestartet wird:

  1. Erstellen Sie einen Symlink zu Ihrer bevorzugten Shell. Z.B:sudo ln -s /bin/bash /usr/local/bin/bash
  2. Öffnen Sie die Terminaleinstellungen und wählen Sie die Registerkarte "Allgemein".
  3. Wählen Sie "Shells öffnen mit: Befehl" und geben Sie den in Schritt 1 erstellten Symlink ein. Beispiel: "/ usr / local / bin / bash".

Hinweis 1: Möglicherweise müssen Sie auch bashund -bashzur Prozessliste unter "Terminaleinstellungen> Profile> Shell> Vor dem Schließen fragen" hinzufügen .

Hinweis 2: /usr/local/binKann im rootlosen Modus von OS X 10.11 (El Capitan) beschrieben werden.

So überprüfen Sie den Fix:

  • Öffnen Sie ein neues Terminalfenster.
  • "Last Login:" sollte nicht oben angezeigt werden
  • Öffnen Sie den Inspektor (Befehl + I) und wählen Sie die Registerkarte Info.
  • Der Befehl sollte login -pfq username /usr/bin/bashoder lautenlogin -pfql username ...

Wichtig: Wenn der Anmeldebefehl den -qParameter nicht enthält , haben Sie das Problem nicht behoben.

Sie können auch sudo fs_usage | grep 'asl.*login'überprüfen, ob /var/log/aslbeim Öffnen eines neuen Terminalfensters nicht darauf zugegriffen wird.

Einzelheiten:

Hier spielen sich eine Reihe von Fehlern ab.

Die eigentliche Ursache für die Langsamkeit ist /usr/bin/login, dass standardmäßig das Datum Ihrer letzten Anmeldung angezeigt wird. Um dieses letzte Anmeldedatum zu erhalten, durchsucht es die ASL-Datenbank (Apple System Log) unter /var/log/asl/. Diese Protokolldateien können sehr stark fragmentiert sein und es ist diese Dateifragmentierung, die die Verzögerung beim Öffnen eines neuen Fensters oder einer neuen Registerkarte verursacht. (Bug 1)

Die einzige Möglichkeit, die ASL-Suche nach der letzten Anmeldung zu unterdrücken, besteht darin, den -qParameter an zu übergeben /usr/bin/login. Die .hushloginDatei unterdrückt auch die Anzeige "Last Login", nicht jedoch die teure ASL-Suche. (Bug 2)

Terminal wird immer /usr/bin/loginzum Starten jedes neuen Fensters / jeder neuen Shell verwendet. Es gibt keine Möglichkeit, eine Shell direkt zu starten, und es gibt keine Möglichkeit, die an /usr/bin/login(Bug 3) übergebenen Parameter direkt zu steuern .

Wie sich herausstellt, übergibt Terminal den -qParameter an, /usr/bin/loginwenn es für die Verwendung einer nicht standardmäßigen Shell konfiguriert ist . (Bug 4)

Der -qParameter ist das, was wir brauchen, um das Problem zu vermeiden, daher der Symlink zu /usr/local/bin/bash.


6
Wissen Sie, warum -q hinzugefügt wird, wenn der Befehl ein Symlink zu / bin / bash ist, aber nicht, wenn es sich um / bin / bash handelt?
Lri 18.11.12

3
@LauriRanta Es scheint ein Fehler im 10.7 und 10.8 Terminal zu sein. Wenn der Startbefehl auf festgelegt ist, /bin/bashverhält er sich so, als ob die Standardanmeldeshell ausgewählt wurde. Jeder andere Befehl als /bin/bashfunktioniert ordnungsgemäß. Daher ist die Verwendung von / usr / bin / bash nur eine Problemumgehung. Dieser Fehler ist in Snow Leopard nicht vorhanden.
Darren

5
@ Darren Hast du Apple diesen verdächtigen Fehler gemeldet? Wenn nicht, können Sie dies bitte über folgende Adresse
Graham Miln

3
Leider wird jedes Mal, wenn Sie das Terminal von Yosemite schließen, eine Meldung angezeigt, dass Bash ausgeführt wird. Also keine schöne Lösung :(
Claus Jørgensen

2
@ ClausJørgensen Ich habe dieses Problem nicht erlebt. Sie können die "Shell" -Einstellungen auf der Registerkarte "Profile" überprüfen.
Darren

20

Ich musste von der Anmeldeshell zum Befehl /bin/bash -il in iTerms Einstellungen> Profile> Allgemein> Befehl wechseln .

Ich musste die Option -l( Bash so machen, als ob sie als Anmeldeshell aufgerufen worden wäre ) hinzufügen, um Umgebungsvariablen von zu setzen~/.bash_profile



4
Von allen Lösungen hat diese für mich funktioniert. +50!
Bhavin Doshi

1
Tolle Informationen rund um diesen Thread! Dies ist die Lösung, die ich verwendet habe, da keine Symlinks oder ähnliches erstellt werden mussten. Meine neuen Startzeiten für die Shell sind mit dieser Lösung von ~ 5-10 Sekunden auf Instant gestiegen.
DustinB

16

.hushlogin

Erstellen Sie eine leere Datei in Ihrem Home-Ordner mit dem Namen .hushlogin; Dadurch wird die Zeit, die zum Anzeigen einer Registerkarte "Terminal.app" benötigt wird, erheblich verkürzt.

Sie können die .hushloginDatei in Terminal.app mit dem folgenden Befehl erstellen :

touch ~/.hushlogin

Die Datei wird sofort wirksam.

Weitere Informationen zur .hushloginDatei und zum Anmeldevorgang im Allgemeinen finden Sie im Anmeldehandbuch .

Anmeldevorgang beruhigen

Wenn Sie eine neue Registerkarte "Terminal" erstellen, führen Sie den Anmeldevorgang durch. Der Vorgang umfasst das Abrufen verschiedener Informationen zu Ihrer vorherigen Anmeldesitzung, der Nachricht des Tages und das Anzeigen von Systemnachrichten. Dies kann zu erheblichen Verzögerungen führen. Versuchen Sie, diese Meldungen auszublenden, um festzustellen, ob die Verzögerung verschwindet.


6
.hushlogin löst das Problem nicht wirklich. Dies kann mit bestätigt werden opensnoop. Siehe meine Antwort unten.
Darren

1
@Darrren: man login sagt mir: -q Dies erzwingt leise Logins, als ob ein .hushlogin vorhanden wäre. Die Option q verhindert das Problem, funktioniert jedoch genauso wie bei hushlogin.
Christian

8

OK, ich habe eine ähnliche Schlussfolgerung wie Darren, obwohl sich der Profilierungsmechanismus geringfügig unterscheidet (Hinweis: Die langsame Anmeldung kann in Yosemite weiterhin auftreten).

Hier sehen Sie anhand des OS X- Beispielprofilerbefehls , was tatsächlich ausgeführt wird, wenn Sie ein neues Anmeldefenster starten .

Finden Sie heraus, welchen Befehl ein normaler Login ausführt

$ ps -ef | grep login

Du wirst so etwas sehen login -pfl username /bin/bash -c exec -la bash /bin/bash

Erstellen Sie einen Skriptdateinamen profile_login.shmit den folgenden Inhalten, indem Sie a hinzufügen

-c ""

bis zum Ende des erkannten Befehls, um die sofortige Rückgabe der Bash mit folgendem Inhalt anzufordern:

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

Mach es ausführbar

$ chmod u+x profile_login.sh

und starte es mit sudo ( sampleBefehl benötigt es)

$ sudo ./profile_login.sh

OK, mach weiter und führe es aus. Zum Beispiel, indem Sie zuerst den purgeBefehl ausführen . Auf meiner Box habe ich eine große Ausgabekurve. Auf der Suche nach den "am größten nummerierten Zweigen" (normalerweise oben) sah ich die folgenden zwei größten Täter :

Eine von etwas namens, pam_startdie pam auth lib images zu öffnen scheint

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

und das wird manchmal von einem anderen Täter gefolgt 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]

Grundsätzlich gibt es also zwei Täter. Eines ist pam(irgendeine Art von Authentifizierungssystem) und das andere ist das asl"Erkennen Ihrer neuesten Anmeldedaten". Es reicht also anscheinend nicht aus, nur Ihre /private/var/log/asl/*.aslDateien zu löschen . Das Laden von PAM ist auf meinem Rechner ohnehin viel teurer [SSD]. Fühlen Sie sich frei, das obige Skript auszuführen und zu prüfen, ob Ihr System identisch ist. Interessanterweise scheint der Quellcode für diese Methodenaufrufe auch online verfügbar zu sein, zum Beispiel openpam_dynamic

Wenn ich der Antwort von Darren folge und meine "geöffneten Muscheln" durch etwas anderes als "/ bin / bash" ersetze, werden die folgenden Zeilen angezeigt, die zum Starten neuer Terminal-Registerkarten verwendet werden:

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

Also, wenn ich jetzt den gleichen sampleTrick auf den neuen Login-Befehl verwende

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

es wird ein viel kleinerer Stacktrace generiert, der größte Übeltäter ist:

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

Ich denke, das liegt daran, dass der Login "-q" -Parameter jetzt verwendet wird. Anscheinend überspringt dieser Parameter sowohl das Laden der Pam-Module als auch das Nachschlagen der letzten Anmeldezeit (beide Täter). Laut den Dokumenten des loginBefehls sollte das Berühren der ~/.hushloginDatei dasselbe tun, aber anscheinend funktioniert dies nicht mehr [zumindest bei mir mit 10.10].

Zusammenfassend ist es also nicht ausreichend, /private/var/log/asl/*.asl zu entfernen (in meinem Experiment war dies nur für höchstens 1/3 der tatsächlichen Verlangsamung verantwortlich, wenn Sie dort mehr Dateien hätten, könnte dies jedoch eine Rolle spielen für einen größeren Prozentsatz bin ich mir sicher).

Wenn Sie ähnliche Skripte verwenden, sollten Sie in der Lage sein, zu ermitteln, warum Ihr lokaler Computer zum Stillstand gekommen ist, und zu prüfen, ob die oben genannte Korrektur auf Sie zutrifft. Fühlen Sie sich frei, hier zu kommentieren.

UPDATE: Es scheint, dass coresymbolication_load_imagedies auch beim login -pfqlAufrufen eine Menge Zeit in Anspruch nehmen kann (vermutlich muss sich ein Pam-Authentifizierungsmodul oder ein anderes Modul bei einem zentralen Anmeldeserver "auswählen" oder ein anderes, also muss es auf die Antwort eines Dritten warten ). Die einzige echte Problemumgehung, die ich gefunden habe, besteht darin, iTerm2 zu verwenden und stattdessen die Einstellungen -> Profile -> Allgemein -> Befehl auf zu ändern /bin/bash.


1
Abgesehen von der ASL-Suche werden Anmeldeverzögerungen meistens dadurch verursacht, dass Sie sich in einem Netzwerk mit einem Verzeichnisserver befinden, der langsam reagiert, wenn Sie nach Ihren Benutzerinformationen gefragt werden. Wenn Sie nicht in einem Netzwerk mit aktivierten Verzeichnisdiensten arbeiten, weiß ich nicht, was außer einer allgemeinen Systemüberlastung (CPU-Auslastung, Speicherdruck, E / A-Überlastung) noch viel Zeit in Anspruch nehmen würde.
Chris Seite

@ChrisPage Ja, wahrscheinlich haben einige Netzwerkverzeichnisdienste irgendetwas, guter Tipp.
Rogerdpack

3

Es geht darum, die Ursache zu untersuchen. Sie können sehen, was getan wird, während der Prozess beginnt, indem Sie eingeben, bash -xwodurch der Prozess zum Starten der Shell ausgedruckt wird.

Persönlich bemerke ich nur die Verzögerung zwischen der Aktivierung und Deaktivierung der App und in der ersten Registerkarte, die nach einer gewissen Zeit der Aktivität erstellt wurde. Ich denke immer, dass es um das Verschieben von Speicherseiten geht.


2

Reduzieren Sie Ihren Verlauf auf 4 bis 10 000 Zeilen und versuchen Sie möglicherweise, alle gespeicherten Fenster zu schließen und zu verwerfen. Ich habe gesehen, dass beide auf langsameren Maschinen einen Unterschied machen - insbesondere auf solchen ohne SSD als Speicher.


2

In meinem Fall stellte ich fest, dass der Schuldige Active Directory war , nachdem ich das oben Genannte auf meiner Arbeitsmaschine erfolglos ausprobiert hatte . Das Update bestand darin, das Verzeichnisdienstprogramm aufzurufen und die AD-Diensteinstellungen zu bearbeiten (doppelklicken Sie auf "Active Directory"), um "Mobiles Konto bei Anmeldung erstellen" zu aktivieren:

Screenshot der Anwendung Directory Utility mit geöffneten Active Directory-Einstellungen

Dies führt anscheinend dazu, dass die AD-Anmeldeinformationen lokal zwischengespeichert werden, sodass das System nicht mehr bei jedem Versuch, Ihr Kennwort zu validieren, zum Server wechseln muss.

Sie können das Verzeichnisdienstprogramm mit Spotlight oder über den Abschnitt "Anmeldeoptionen" in den Systemeinstellungen / Benutzer und Gruppen aufrufen (klicken Sie auf die Schaltfläche "Bearbeiten ..." neben "Netzwerkkontoserver"):

Bereich "Benutzer und Gruppen" mit "Anmeldeoptionen" und "Bearbeiten ..."


0

Renn einfach:

sudo creatbyproc.d
sudo newproc.d

in separaten Terminals und öffnen Sie das neue Open, um zu sehen, was während dieser Zeit ausgeführt wird.

Wenn nichts offensichtlich ist, versuchen Sie Folgendes:

sudo dtruss -an Terminal

Dadurch werden alle Ihre Details gedruckt, die beim Laden der Registerkarte auftreten.


0

Öffne /etc/profileund füge die Zeile PATH=""so hinzu, dass sie so aussieht:

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

0

Das Problem für mich war, dass der Active Directory-Domänenserver ungültig war.

Das Ändern und Neustarten des Macs hat das Problem behoben.

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.