Bagaimana cara mempercepat waktu pemuatan tab Terminal?


93

Bagaimana saya bisa mempercepat startup terminal di Lion?

Saya tidak mengacu pada startup dari aplikasi Terminal, tetapi ke windows terminal startup, seperti ketika saya membuka tab baru.

Saya tidak punya apa-apa di file .bash_profile saya dan saya jalankan rm -rf /private/var/log/asl/*.aslsetiap 4 jam (yang menghapus file-file itu yang biasanya membuat terminal lambat).

Saat ini, ketika saya membuka tab baru, dibutuhkan 3-4 detik hingga saya dapat menjalankan sesuatu.


2
Mungkin ada yang salah dengan sistem Anda? Seharusnya tidak selambat itu. Kadang-kadang dibutuhkan satu atau dua detik untuk saya, tetapi biasanya hanya sepersekian detik. Dan saya punya sedikit adil .bash_profile(juga memeriksa ~/.profiledengan cara). Juga: perhatikan Anda dapat mulai mengetik saat bash sedang memuat, dan biasanya apa yang Anda ketik akan disalin ke command prompt setelah siap.
Abhi Beckert

Apakah Anda menggunakan akun jaringan atau direktori home jaringan? Apakah Terminal responsif terhadap input pengguna saat sedang membuat terminal? Apakah ini menampilkan kursor sibuk pemintalan?
Chris Page

1
Untuk mengetahui di mana Terminal menghabiskan waktu, buka Activity Monitor, pilih Terminal dan klik tombol Toolbar Proses Sampel, lalu segera pergi ke Terminal dan buat jendela / tab baru. Sampel dapat memberikan petunjuk ke mana waktu akan pergi. Juga, perhatikan daftar proses di Activity Monitor: jika "login" atau "bash" (atau shell apa pun yang Anda gunakan) muncul dalam daftar selama penundaan, itu berarti penundaan tersebut kemungkinan terjadi di salah satu dari dua program tersebut dan tidak Terminal.
Chris Page

Sudahkah Anda memeriksa variabel PATH Anda? Saya perhatikan bahwa saya lama sekali dengan banyak pengulangan karena beberapa .bashrc membingungkan. Saya menghapus pengulangan dan semuanya dipercepat!
190290000 Ruble Man

Jawaban:


93

Jawaban singkat:

Masalahnya disebabkan oleh pencarian log sistem ASL (berpotensi) yang mahal. Untuk melihat ini dalam tindakan, jalankan sudo fs_usage | grep 'asl.*login'di jendela Terminal, lalu buka jendela Terminal baru.

Untuk mengatasi masalah, konfigurasikan Terminal untuk meluncurkan shell non-standar:

  1. Buat symlink ke shell pilihan Anda. Misalnya:sudo ln -s /bin/bash /usr/local/bin/bash
  2. Buka Terminal Preferences dan pilih tab "General".
  3. Pilih "Shells open with: Command" dan masukkan symlink yang Anda buat di langkah 1. Misalnya "/ usr / local / bin / bash".

Catatan 1: Anda mungkin juga perlu menambahkan bashdan -bashke daftar proses di "Preferensi Terminal> Profil> Shell> Tanya sebelum menutup".

Catatan 2: /usr/local/bindapat ditulis dalam mode Rootless OS X 10.11 (El Capitan).

Untuk memverifikasi perbaikan:

  • Buka jendela Terminal baru.
  • "Login Terakhir:" seharusnya tidak ditampilkan di atas
  • Buka inspektur (Perintah + I) dan pilih tab Info.
  • Perintah harus membaca login -pfq username /usr/bin/bashataulogin -pfql username ...

Penting: Jika perintah login tidak menyertakan -qparameter, maka Anda belum memperbaiki masalahnya.

Anda juga dapat menggunakan sudo fs_usage | grep 'asl.*login'untuk memverifikasi yang /var/log/asltidak diakses saat membuka jendela Terminal baru.

Detail:

Ada sejumlah bug yang berperan di sini.

Penyebab kelambatan sebenarnya adalah /usr/bin/login, yang secara default akan menampilkan tanggal login terakhir Anda. Untuk mendapatkan tanggal login terakhir ini, ia mencari basis data ASL (Apple System Log) di /var/log/asl/. File-file log ini bisa sangat terfragmentasi dan ini adalah file fragmentasi yang menyebabkan penundaan saat membuka jendela atau tab baru. (Bug 1)

Satu-satunya cara untuk menekan pencarian ASL untuk login terakhir adalah dengan mengirimkan -qparameter /usr/bin/login. The .hushloginFile juga akan menekan "Terakhir masuk" layar, tetapi tidak menekan pencarian ASL mahal. (Bug 2)

Terminal selalu digunakan /usr/bin/loginuntuk meluncurkan setiap jendela / shell baru. Tidak ada opsi untuk meluncurkan shell secara langsung juga tidak ada cara untuk secara langsung mengontrol parameter yang diteruskan ke /usr/bin/login(Bug 3).

Ternyata, Terminal akan meneruskan -qparameter /usr/bin/loginketika dikonfigurasi untuk menggunakan shell non-standar . (Bug 4)

The -qparameter apa yang kita butuhkan untuk menghindari masalah, maka symlink untuk /usr/local/bin/bash.


6
Apakah Anda tahu mengapa -q ditambahkan jika perintahnya adalah symlink ke / bin / bash tetapi tidak jika itu / bin / bash?
Lri

3
@LauriRanta Sepertinya ada bug di Terminal 10.7 dan 10.8. Ketika perintah startup diatur untuk /bin/bashberperilaku seolah-olah Shell Login Default dipilih. Perintah apa pun selain /bin/bashakan bekerja dengan benar, jadi menggunakan / usr / bin / bash hanyalah solusi. Bug ini tidak ada di Snow Leopard.
Darren

5
@ Darren, sudahkah Anda melaporkan dugaan bug ini ke Apple? Jika tidak, dapatkah Anda melakukannya melalui: bugreport.apple.com
Graham Miln

3
Sayangnya, ini menghasilkan promt tentang bash berjalan setiap kali Anda menutup terminal di Yosemite. Jadi bukan perbaikan yang bagus :(
Claus Jørgensen

2
@ ClausJørgensen Saya belum mengalami masalah itu. Anda mungkin ingin memeriksa pengaturan "Shell" di bawah tab Profiles.
Darren

20

Apa yang saya butuhkan berubah dari shell login ke perintah /bin/bash -il di Preferensi iTerm > Profil> Umum> Perintah .

Saya membutuhkan opsi -l( Buat bash bertindak seolah-olah itu telah dipanggil sebagai shell login ) ditambahkan untuk mengatur variabel lingkungan dari~/.bash_profile


Yang menghentikan pencarian login ASL sesuai pertanyaan yang diterima
user151019

4
dari semua solusi, yang ini berhasil untuk saya. +50!
Bhavin Doshi

1
Informasi hebat di sekitar di utas ini! Ini adalah solusi yang saya gunakan karena tidak perlu membuat symlink atau apa pun. Waktu startup shell baru saya telah berubah dari ~ 5-10 detik menjadi instan dengan solusi ini.
DustinB

16

.hushlogin

Buat file kosong di folder rumah Anda yang disebut .hushlogin; ini akan secara signifikan mengurangi waktu yang diperlukan untuk tab Terminal.app untuk muncul.

Anda dapat membuat .hushloginfile di Terminal.app menggunakan perintah berikut:

touch ~/.hushlogin

File akan segera berlaku.

Anda dapat mempelajari lebih lanjut tentang .hushloginfile dan proses login secara umum di manual login .

Menenangkan proses masuk

Saat Anda membuat tab Terminal baru, Anda sedang melalui proses login. Proses ini melibatkan pengambilan berbagai informasi tentang sesi login Anda sebelumnya, pesan hari ini, dan menampilkan pesan sistem. Ini bisa menjadi sumber keterlambatan yang signifikan. Coba pisahkan pesan-pesan ini untuk melihat apakah penundaannya hilang.


6
.hushlogin tidak benar-benar menyelesaikan masalah. Ini dapat dikonfirmasi dengan menggunakan opensnoop. Lihat jawaban saya di bawah ini.
Darren

1
@Arrren: man login memberitahu saya: -q Ini memaksa login diam, seolah-olah .hushlogin hadir. Opsi q adalah apa yang Anda katakan mencegah masalah, tetapi itu hanya melakukan hal yang sama dengan hushlogin.
Kristen

8

OK saya punya kesimpulan yang mirip dengan Darren, meskipun mekanisme profiling sedikit berbeda (NB login lambat masih dapat terjadi di Yosemite).

Berikut adalah cara untuk mengetahui apa yang sebenarnya sedang berjalan saat Anda memulai jendela login baru, menggunakan perintah sampel profiler OS X.

Cari tahu perintah apa yang dijalankan oleh login normal

$ ps -ef | grep login

Anda akan melihat sesuatu seperti login -pfl username /bin/bash -c exec -la bash /bin/bash

Buat nama file skrip profile_login.shdengan konten berikut dengan menambahkan a

-c ""

ke akhir perintah yang ditemukan untuk meminta bash segera kembali, dengan konten seperti ini:

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

Jadikan itu dapat dieksekusi

$ chmod u+x profile_login.sh

dan jalankan dengan menggunakan sudo ( sampleperintah mengharuskannya)

$ sudo ./profile_login.sh

OK jadi silakan jalankan. Misalnya dengan menjalankan purgeperintah terlebih dahulu. Di kotak saya, saya mendapat grafik output yang besar. Mencari "cabang-cabang bernomor terbesar" (biasanya di atas) saya melihat dua pelanggar terbesar berikut :

Satu dari sesuatu yang disebut pam_startyang muncul untuk membuka gambar 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]

dan itu terkadang diikuti oleh pelaku lain 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]

Jadi pada dasarnya, ada dua pelaku. Salah satunya adalah pam(beberapa jenis sistem otentikasi) dan yang lainnya adalah asl"deteksi login terbaru Anda". Begitu rupanya hanya menghapus Anda /private/var/log/asl/*.aslfile tidak cukup. Pemuatan pam jauh lebih mahal pada mesin saya, toh [SSD]. Jangan ragu untuk menjalankan skrip di atas dan melihat apakah sistem Anda sama. Menariknya, kode sumber untuk panggilan metode ini tampaknya juga tersedia online, misalnya openpam_dynamic

Jika saya mengikuti jawaban Darren, dan mengganti preferensi "shells open with" saya dengan sesuatu selain / bin / bash, saya kemudian melihat baris berikut yang digunakan untuk memulai tab terminal baru:

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

Jadi jika sekarang saya menggunakan sampletrik yang sama pada perintah login baru

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

stacktrace yang jauh lebih kecil dihasilkan, pelaku terbesar adalah:

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

Saya pikir ini karena parameter login "-q" sekarang sedang digunakan. Rupanya parameter ini melompati memuat modul pam dan mencari waktu login terakhir (kedua pelaku). Menurut dokumen loginperintah, menyentuh ~/.hushloginfile harus melakukan hal yang sama, tetapi ternyata ini tidak lagi berfungsi [setidaknya untuk saya dengan 10.10].

Jadi, secara ringkas, menghapus /private/var/log/asl/*.asl tidak cukup (dalam percobaan saya, itu hanya menyumbang paling banyak 1/3 dari pelambatan yang sebenarnya, meskipun jika Anda punya file di sana, itu bisa menjelaskan untuk persentase yang lebih besar, saya yakin).

Pokoknya menggunakan skrip yang serupa, Anda harus dapat mengetahui apa yang menyebabkan mesin lokal Anda macet, dan melihat apakah perbaikan di atas berlaku untuk Anda. Jangan ragu untuk berkomentar di sini.

UPDATE: tampaknya coresymbolication_load_imagemasih bisa memakan waktu banyak, bahkan ketika login -pfqldipanggil (mungkin beberapa modul otentikasi pam atau lainnya harus "dial out" ke server login pusat atau sejenisnya, jadi harus menunggu respons dari pihak ke-3 ). Jadi satu-satunya solusi nyata yang saya temukan adalah menggunakan iTerm2, dan ubah preferensi -> profil -> umum -> Perintah untuk /bin/bashsebaliknya.


1
Terlepas dari pencarian ASL, keterlambatan login paling sering disebabkan oleh berada di jaringan dengan server direktori yang merespons secara lambat ketika ditanya info pengguna Anda. Jika Anda tidak berada di jaringan dengan layanan direktori diaktifkan, maka saya tidak tahu apa lagi yang akan memakan waktu yang signifikan, selain kemacetan sistem umum (penggunaan CPU, tekanan memori, kemacetan I / O).
Chris Page

@ ChrisPage Ya mungkin beberapa layanan direktori jaringan sesuatu atau lainnya, tip yang bagus.
rogerdpack

3

Ini semua tentang menyelidiki penyebabnya. Anda dapat melihat apa yang sedang dilakukan saat proses dimulai dengan memasukkan bash -xyang akan mencetak proses memulai shell.

Secara pribadi, saya hanya melihat penundaan antara aktivasi dan de-aktivasi aplikasi dan di tab pertama yang dibuat setelah periode aktivitas. Itu selalu membuat saya berpikir bahwa ini adalah tentang halaman memori yang dipindahkan.


2

Kurangi riwayat Anda menjadi sesuatu antara 4 dan 10 ribu baris dan mungkin mencoba berhenti dan membuang semua jendela yang disimpan. Saya telah melihat keduanya membuat perbedaan pada mesin yang lebih lambat - terutama yang tanpa SSD untuk penyimpanan.


2

Dalam kasus saya, setelah mencoba hal di atas pada mesin kerja saya tanpa hasil, saya menemukan bahwa pelakunya adalah Active Directory. Cara mengatasinya adalah masuk ke Direktori Utilitas dan mengedit pengaturan layanan AD (klik dua kali pada "Direktori Aktif") untuk mengaktifkan "Buat akun seluler saat masuk":

tangkapan layar aplikasi Utilitas Direktori dengan pengaturan Direktori Aktif terbuka

Ini tampaknya menyebabkan kredensial AD di-cache secara lokal, sehingga sistem tidak lagi harus pergi ke server setiap kali mencoba untuk memvalidasi kata sandi Anda.

Anda dapat membuka Utilitas Direktori dengan Spotlight atau melalui bagian "Opsi Masuk" dari Preferensi Sistem / Pengguna & Grup (pilih tombol "Edit ..." di sebelah "Server Akun Jaringan"):

Panel Pengguna & Grup menampilkan "Opsi Masuk" dan "Edit ..."


0

Lari saja:

sudo creatbyproc.d
sudo newproc.d

di terminal terpisah dan buka yang baru terbuka untuk melihat apa yang sedang dieksekusi selama waktu itu.

Jika tidak ada yang jelas, coba yang berikut ini:

sudo dtruss -an Terminal

Ini akan mencetak semua detail Anda yang terjadi pada waktu pemuatan tab.


0

Buka /etc/profiledan tambahkan baris PATH=""sehingga terlihat seperti ini:

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

0

Masalahnya bagi saya adalah server domain direktori aktif tidak valid.

Mengubahnya lalu me-reboot mac memperbaikinya.

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.