新しい[ターミナル]タブの読み込み時間を短縮するにはどうすればよいですか?


93

Lionでターミナルの起動を高速化するにはどうすればよいですか?

ターミナルアプリケーションの起動ではなく、新しいタブを開いたときのような起動ターミナルウィンドウを参照しています。

.bash_profileファイルには何もありませんがrm -rf /private/var/log/asl/*.asl、4時間ごとに実行します(通常、端末が遅くなるファイルをクリアします)。

現在、新しいタブを開くと、何かを実行できるようになるまで3〜4秒かかります。


2
システムに何か他の問題があるのでしょうか?そんなに遅くないはずです。場合によっては1〜2秒かかりますが、通常はほんの一瞬です。そして、私はかなりの部分を持っています.bash_profile(また~/.profile、ちなみに確認してください)。また、bashの読み込み中に入力を開始できることに注意してください。通常、入力した内容は準備ができたらコマンドプロンプトにコピーされます。
アブヒベッカート

ネットワークアカウントまたはネットワークホームディレクトリを使用していますか?端末は、端末の作成中にユーザー入力に応答しますか?回転するビジーカーソルが表示されますか?
クリスページ

1
ターミナルがどこで時間を費やしているかを調べるには、アクティビティモニターを開き、ターミナルを選択して[サンプルプロセス]ツールバーボタンをクリックし、すぐにターミナルに移動して新しいウィンドウ/タブを作成します。サンプルは、時間がどこに向かっているかの手がかりを提供する場合があります。また、アクティビティモニターでプロセスリストを確認します。「login」または「bash」(または使用しているシェル)が遅延中にリストに表示される場合は、これら2つのプログラムのいずれかで遅延が発生している可能性が高いことを意味しますターミナル。
クリスページ

PATH変数を確認しましたか?私は、紛らわしい.bashrcが継続しているために、私のものが非常に長く、多くの繰り返しがあることに気付きました。繰り返しを削除し、すべてが高速化されました!
190290000ルーブルマン

回答:


93

簡潔な答え:

この問題は、(潜在的に)高価なASLシステムログルックアップが原因です。この動作を確認するにsudo fs_usage | grep 'asl.*login'は、ターミナルウィンドウで実行し、新しいターミナルウィンドウを開きます。

問題を解決するには、非標準シェルを起動するようにターミナルを構成します。

  1. 好みのシェルへのシンボリックリンクを作成します。例えば:sudo ln -s /bin/bash /usr/local/bin/bash
  2. ターミナル設定を開き、「一般」タブを選択します。
  3. 「Shells open with:Command」を選択し、ステップ1で作成したシンボリックリンクを入力します。たとえば、「/ usr / local / bin / bash」。

注1:あなたはまた、追加する必要がありますbash-bashでのプロセスのリストに「ターミナル設定>プロファイル>シェル>閉じる前に確認します」。

注2:/usr/local/binOS X 10.11(El Capitan)Rootlessモードで書き込み可能です。

修正を確認するには:

  • 新しいターミナルウィンドウを開きます。
  • 「最後のログイン:」は上部に表示されません
  • インスペクタを開き(Command + I)、[情報]タブを選択します。
  • コマンドが読むべきlogin -pfq username /usr/bin/bashlogin -pfql username ...

重要:loginコマンドに-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


6
コマンドが/ bin / bashへのシンボリックリンクであるが-bin / bashである場合ではなく、-qが追加される理由を知っていますか?
Lri

3
@LauriRanta 10.7および10.8ターミナルのバグのようです。スタートアップコマンドがに設定され/bin/bashている場合、デフォルトログインシェルが選択されたように動作します。以外のコマンドはすべて/bin/bash正常に機能するため、/ usr / bin / bashを使用することは単なる回避策です。このバグはSnow Leopardには存在しません。
ダレン

5
@ダレン、この疑わしいバグをアップルに報告しましたか?そうでない場合は、bugreport.apple.com
Graham Milnで

3
残念ながら、これにより、Yosemiteでターミナルを閉じるたびにbashが実行されます。だからいい修正ではありません:(
クラウスヨルゲンセン14

2
@ClausJørgensen私はその問題を経験していません。[プロファイル]タブで[シェル]設定を確認することをお勧めします。
ダレン14

20

必要なのは/bin/bash -il 、iTermの[ 設定]> [プロファイル]> [全般]> [コマンド]でログインシェルからコマンドに変更することでした。

環境変数を設定するために追加されたオプション-lログインシェルとして起動されたかのようにbashを動作させる)が必要でした~/.bash_profile


受け入れられた質問
-user151019

4
すべての解決策のうち、これは私のために働いた。+50!
Bhavin道志

1
このスレッド内のすべての周りの素晴らしい情報!これは、シンボリックリンクなどを作成する必要がないため、私が使用したソリューションです。私の新しいシェルの起動時間は、このソリューションで5〜10秒から瞬時になりました。
ダスティンB

16

.hushlogin

という名前のホームフォルダーに空のファイルを作成します.hushlogin。これにより、Terminal.appタブが表示されるまでの時間が大幅に短縮されます。

.hushlogin次のコマンドを使用して、Terminal.appにファイルを作成できます。

touch ~/.hushlogin

ファイルはすぐに有効になります。

あなたはについての詳細を学ぶことができ.hushlogin、ファイルや一般的なログインプロセスのログインマニュアル

ログインプロセスを静かにする

新しい[ターミナル]タブを作成すると、ログインプロセスが実行されます。このプロセスには、以前のログインセッションに関するさまざまな情報、その日のメッセージ、およびシステムメッセージの表示が含まれます。これが大幅な遅延の原因になる可能性があります。これらのメッセージをハッシュして、遅延が解消されるかどうかを確認してください。


6
.hushloginは実際には問題を解決しません。これはを使用して確認できますopensnoop。以下の私の答えをご覧ください。
ダレン

1
@Darrren:man login:me -qこれは、.hushloginが存在するかのように、静かなログインを強制します。qオプションはあなたが言っていることで問題を防ぎますが、hushloginと同じことをします。
クリスチャン

8

OK私はDarrenと同様の結論を出していますが、プロファイリングメカニズムはわずかに異なります(ただし、Yosemiteではログインが遅い場合があります)。

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

OKですので、実行してください。たとえば、purge最初にコマンドを実行します。私の箱には、大きな出力グラフがありました。「最大番号のブランチ」(通常は上部)を探して、次の2つの最大の違反者を見ました。

pam_startpam auth libイメージを開くように見えるものからの1つ

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

したがって、基本的には2人の犯罪者がいます。1つはpam(ある種の認証システム)、もう1つはasl「最新のログインを検出する」ものです。したがって、明らかにファイルを削除するだけ/private/var/log/asl/*.aslでは十分ではありません。とにかく[SSD]、私のマシンでのpamのロードははるかに高価です。上記のスクリプトを自由に実行して、システムが同じかどうかを確認してください。興味深いことに、これらのメソッド呼び出しのソースコードは、たとえばopenpam_dynamicのようにオンラインでも利用できるようです

Darrenの答えに従い、「shells open with」プリファレンスを/ 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を使用し、代わりに設定->プロファイル->一般->コマンドを変更する/bin/bashことです。


1
ASLルックアップとは別に、ログインの遅延は、多くの場合、ユーザー情報を求められたときに応答が遅いディレクトリサーバーを備えたネットワーク上にあることが原因です。ディレクトリサービスが有効になっているネットワーク上にいない場合、一般的なシステムの輻輳(CPU使用率、メモリの負荷、I / O輻輳)以外に、他に何がかなりの時間を要するかわかりません。
クリスページ

@ChrisPageええ、おそらくいくつかのネットワークディレクトリサービスは何か他の良いヒントです。
rogerdpack

3

原因を調査することがすべてです。プロセスを開始する間に何が行われているかを確認bash -xするには、シェルを起動するプロセスを出力します。

個人的には、アプリのアクティブ化と非アクティブ化の間の遅延、および一定期間のアクティビティ後に作成された最初のタブのみに気付きます。常に、メモリページが移動されることだと考えさせられます。


2

履歴を4〜1万行に減らし、保存されているすべてのウィンドウを終了して破棄してください。私は両方とも遅いマシン、特にストレージ用のSSDなしのマシンで違いを生むのを見てきました。


2

私の場合、仕事用マシンで上記の操作を成功させなかった後、犯人はActive Directoryであることがわかりました。修正は、ディレクトリユーティリティに移動し、ADサービス設定を編集して(「Active Directory」をダブルクリック)、「ログイン時にモバイルアカウントを作成」を有効にすることでした。

Active Directory設定を開いたディレクトリユーティリティアプリケーションのスクリーンショット

これにより、明らかにAD資格情報がローカルにキャッシュされるため、システムはパスワードを検証するたびにサーバーにアクセスする必要がなくなります。

Directory Utilityには、Spotlightを使用するか、システム環境設定/ユーザーとグループの「ログインオプション」セクションからアクセスできます(「ネットワークアカウントサーバー」の横にある「編集…」ボタンを選択します)。

「ログインオプション」と「編集…」を表示するユーザーとグループペイン


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

私にとっての問題は、Active Directoryドメインサーバーが無効だったことです。

変更してからMacを再起動すると修正されました。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.