Lionでターミナルの起動を高速化するにはどうすればよいですか?
ターミナルアプリケーションの起動ではなく、新しいタブを開いたときのような起動ターミナルウィンドウを参照しています。
.bash_profileファイルには何もありませんがrm -rf /private/var/log/asl/*.asl
、4時間ごとに実行します(通常、端末が遅くなるファイルをクリアします)。
現在、新しいタブを開くと、何かを実行できるようになるまで3〜4秒かかります。
Lionでターミナルの起動を高速化するにはどうすればよいですか?
ターミナルアプリケーションの起動ではなく、新しいタブを開いたときのような起動ターミナルウィンドウを参照しています。
.bash_profileファイルには何もありませんがrm -rf /private/var/log/asl/*.asl
、4時間ごとに実行します(通常、端末が遅くなるファイルをクリアします)。
現在、新しいタブを開くと、何かを実行できるようになるまで3〜4秒かかります。
回答:
簡潔な答え:
この問題は、(潜在的に)高価なASLシステムログルックアップが原因です。この動作を確認するにsudo fs_usage | grep 'asl.*login'
は、ターミナルウィンドウで実行し、新しいターミナルウィンドウを開きます。
問題を解決するには、非標準シェルを起動するようにターミナルを構成します。
sudo ln -s /bin/bash /usr/local/bin/bash
注1:あなたはまた、追加する必要がありますbash
と-bash
でのプロセスのリストに「ターミナル設定>プロファイル>シェル>閉じる前に確認します」。
注2:/usr/local/bin
OS X 10.11(El Capitan)Rootlessモードで書き込み可能です。
修正を確認するには:
login -pfq username /usr/bin/bash
かlogin -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
。
/bin/bash
ている場合、デフォルトログインシェルが選択されたように動作します。以外のコマンドはすべて/bin/bash
正常に機能するため、/ usr / bin / bashを使用することは単なる回避策です。このバグはSnow Leopardには存在しません。
必要なのは/bin/bash -il
、iTermの[ 設定]> [プロファイル]> [全般]> [コマンド]でログインシェルからコマンドに変更することでした。
環境変数を設定するために追加されたオプション-l
(ログインシェルとして起動されたかのようにbashを動作させる)が必要でした~/.bash_profile
という名前のホームフォルダーに空のファイルを作成します.hushlogin
。これにより、Terminal.appタブが表示されるまでの時間が大幅に短縮されます。
.hushlogin
次のコマンドを使用して、Terminal.appにファイルを作成できます。
touch ~/.hushlogin
ファイルはすぐに有効になります。
あなたはについての詳細を学ぶことができ.hushlogin
、ファイルや一般的なログインプロセスのログインマニュアル。
新しい[ターミナル]タブを作成すると、ログインプロセスが実行されます。このプロセスには、以前のログインセッションに関するさまざまな情報、その日のメッセージ、およびシステムメッセージの表示が含まれます。これが大幅な遅延の原因になる可能性があります。これらのメッセージをハッシュして、遅延が解消されるかどうかを確認してください。
opensnoop
。以下の私の答えをご覧ください。
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_start
pam 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
ことです。
私の場合、仕事用マシンで上記の操作を成功させなかった後、犯人はActive Directoryであることがわかりました。修正は、ディレクトリユーティリティに移動し、ADサービス設定を編集して(「Active Directory」をダブルクリック)、「ログイン時にモバイルアカウントを作成」を有効にすることでした。
これにより、明らかにAD資格情報がローカルにキャッシュされるため、システムはパスワードを検証するたびにサーバーにアクセスする必要がなくなります。
Directory Utilityには、Spotlightを使用するか、システム環境設定/ユーザーとグループの「ログインオプション」セクションからアクセスできます(「ネットワークアカウントサーバー」の横にある「編集…」ボタンを選択します)。
.bash_profile
(また~/.profile
、ちなみに確認してください)。また、bashの読み込み中に入力を開始できることに注意してください。通常、入力した内容は準備ができたらコマンドプロンプトにコピーされます。