Bagaimana saya dapat mempercepat startup terminal di Singa?
I'm tidak mengacu pada startup dari aplikasi Terminal, tetapi untuk startup terminal windows, seperti ketika saya membuka tab baru.
Saya don't memiliki apa-apa pada saya .bash_profile file dan aku berlari rm -rf /private/var/log/asl/*.asl
setiap 4 jam (yang jelas file-file yang biasanya membuat terminal lambat ).
Saat ini, ketika saya membuka tab baru, itu membutuhkan waktu 3-4 detik sampai aku bisa menjalankan sesuatu.
Jawaban Singkat:
Masalah ini disebabkan oleh (berpotensi) mahal ASL sistem log lookup. Untuk melihat ini dalam tindakan, menjalankan sudo fs_usage | grep 'dpl.*login'
di jendela Terminal, kemudian buka jendela Terminal baru.
Untuk memecahkan masalah ini, mengkonfigurasi Terminal untuk meluncurkan non-standar shell:
sudo ln-s /bin/bash /usr/local/bin/bash
Catatan 1: Anda juga mungkin perlu untuk menambahkan bash
dan -bash
untuk proses daftar di "Terminal Preferensi > Profil > Shell > Meminta sebelum penutupan".
Catatan 2: /usr/local/bin
ditulis di OS X 10.11 (El Capitan) mode Tanpa akar.
Untuk memverifikasi perbaikan:
login-pfq username /usr/bin/bash
atau login-pfql username ...
Penting: Jika login perintah tidak termasuk -q
parameter, maka anda tidak memperbaiki masalah.
Anda juga dapat menggunakan sudo fs_usage | grep 'dpl.*login'
untuk memverifikasi bahwa /var/log/asl
tidak diakses ketika membuka jendela Terminal baru.
Rincian:
Ada sejumlah bug yang bermain di sini.
Sebenarnya penyebab kelambatan /usr/bin/login
, yang secara default akan menampilkan tanggal terakhir anda login. Untuk mendapatkan ini tanggal login terakhir, ini pencarian ASL (Apple Log Sistem) database di /var/log/asl/
. File log ini dapat menjadi sangat terfragmentasi dan's file ini fragmentasi yang menyebabkan delay ketika membuka jendela baru atau tab. (Bug 1)
Satu-satunya cara untuk menekan ASL pencarian untuk login terakhir adalah untuk lulus -q
parameter /usr/bin/login
. The .hushlogin
file juga akan menekan "Login Terakhir" display, tetapi tidak menekan mahal ASL pencarian. (Bug 2)
Terminal selalu menggunakan /usr/bin/login
untuk memulai setiap jendela baru/shell. Tidak ada pilihan untuk meluncurkan shell langsung juga tidak ada cara untuk secara langsung mengontrol parameter yang dilewatkan ke /usr/bin/login
(Bug 3).
Ternyata, Terminal akan lulus -q
parameter /usr/bin/login
ketika dikonfigurasi untuk menggunakan non-standard shell. (Bug 4)
The -q
parameter adalah apa yang kita butuhkan untuk menghindari masalah, oleh karena itu symlink ke /usr/local/bin/bash
.
Apa yang saya butuhkan adalah perubahan dari sebuah login shell dengan perintah /bin/bash -il
di iTerm's Preferensi > Profil > Umum > Perintah.
Aku butuh opsi -l
(Membuat bash bertindak seolah-olah telah dipanggil sebagai sebuah login shell) ditambahkan untuk mengatur variabel lingkungan dari ~/.bash_profile
Buat sebuah file kosong di home folder anda, yang disebut .hushlogin
; hal ini akan secara signifikan mengurangi waktu yang dibutuhkan untuk Terminal.aplikasi tab untuk muncul.
Anda dapat membuat .hushlogin
file di Terminal.aplikasi menggunakan perintah berikut:
touch ~/.hushlogin
File akan segera berlaku.
Anda dapat mempelajari lebih lanjut tentang .hushlogin
file dan proses login secara umum di login manual.
Ketika anda membuat Terminal baru tab, anda akan melalui proses login. Proses ini melibatkan mengambil berbagai informasi tentang anda sebelumnya sesi login, pesan hari ini, dan sistem menampilkan pesan. Hal ini dapat menjadi sumber dari penundaan yang signifikan. Mencoba hushing pesan-pesan ini untuk melihat jika penundaan menghilang.
OK saya memiliki kesimpulan yang sama Darren, meskipun sedikit berbeda mekanisme profiling (NB lambat login masih bisa terjadi di Yosemite).
Berikut ini's cara untuk memberitahu apa adalah benar-benar berjalan ketika anda mulai login window baru, menggunakan OS X sample profiler perintah.
Cari tahu apa perintah login normal executs
$ ps -ef | grep login
Anda'll melihat sesuatu seperti login-pfl username /bin/bash -c exec -la bash /bin/bash
Membuat script file name profile_login.sh
dengan isi sebagai berikut dengan menambahkan
-c ","
untuk akhir ditemukan perintah untuk meminta bash segera kembali, dengan isi seperti ini:
login -pfl username /bin/bash -c exec -la bash /bin/bash -c "" &
sudo sample $! -mayDie # sample the above command
Membuatnya executable
$ chmod u+x profile_login.sh
dan menjalankannya dengan menggunakan sudo (contoh
perintah yang memerlukan)
$ sudo ./profile_login.sh
OK jadi pergi ke depan dan menjalankan hal itu. Misalnya dengan melakukan pembersihan
perintah pertama. Pada kotak saya, saya punya besar output grafik. Mencari "terbesar nomor cabang" (biasanya di bagian atas) saya melihat dua berikut terbesar pelanggar:
Salah satu dari sesuatu yang disebut pam_start
yang muncul untuk membuka pam auth lib gambar
+ ! 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 yang kadang-kadang diikuti oleh yang lain pelaku 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 lain itu asl
"mendeteksi terbaru anda login" hal. Jadi rupanya hanya menghapus /private/var/log/asl/*.asl
file tidak cukup. Pam loading jauh lebih mahal di mesin saya, pokoknya [SSD]. Merasa bebas untuk menjalankan script di atas dan melihat apakah sistem yang sama. Menariknya, kode sumber untuk metode ini panggilan sepertinya juga akan tersedia secara online, misalnya openpam_dynamic
Jika saya mengikuti Darren's jawaban, dan menggantikan saya "kerang terbuka dengan" preferensi untuk sesuatu yang lain dari /bin/bash, saya kemudian melihat baris berikut yang digunakan untuk start new tab terminal:
$ ps -ef | grep login
... login -pfql packrd /bin/bash -c exec -la bash /usr/bin/bash
Jadi jika sekarang saya sama-sama menggunakan sampel
trik baru login perintah
login -pfql username /bin/bash -c exec -la bash /usr/bin/bash -c "" &
sudo sample $! -mayDie
jauh lebih kecil stacktrace dihasilkan, pelaku terbesar menjadi:
+ 8 pam_end (in libpam.2.dylib) + 190 [0x7fff97294ebb]
+ ! 6 coresymbolication_unload_image(CSCppDyldSharedMemoryPage*, ImageLoader const*) (in dyld) + 143 [0x7fff6e0f634f]
Saya pikir ini adalah karena login "-q" parameter ini sekarang sedang digunakan. Rupanya parameter ini melompat kedua memuat modul pam dan mencari login terakhir kali (kedua pelaku). Menurut dokumen dari login
perintah, menyentuh ~/.hushlogin
file harus melakukan hal yang sama, tapi rupanya ini tidak lagi bekerja [setidaknya bagi saya dengan 10.10].
Jadi, dalam ringkasan, menghapus /private/var/log/asl/*.asl tidak cukup (dalam percobaan saya, itu hanya menyumbang paling banyak 1/3 dari yang sebenarnya perlambatan, meskipun jika anda memiliki adat istiadat file yang ada itu bisa menjelaskan persentase yang lebih besar saya'm yakin).
Lagi pula menggunakan script serupa, anda harus dapat memberitahu apa yang's menyebabkan komputer lokal anda ke rawa, dan melihat jika di atas memperbaiki berlaku untuk anda. Merasa bebas untuk komentar di sini.
UPDATE: tampaknya bahwa coresymbolication_load_image
masih dapat mengambil banyak waktu, bahkan ketika login-pfql
dipanggil (mungkin beberapa modul pam authentication atau lainnya harus "dial out" ke central login server atau aneh, sehingga harus menunggu respon dari pihak ke-3). Jadi satu-satunya nyata solusi yang saya temukan adalah dengan menggunakan iTerm2, dan mengubah preferensi -> profil -> umum -> Perintah untuk /bin/bash
sebagai gantinya.
Ini adalah semua tentang menyelidiki penyebabnya. Anda dapat melihat apa yang's sedang dilakukan saat proses dimulai dengan penginputan bash -x
yang akan mencetak proses dari awal sampai shell.
Secara pribadi, saya hanya pemberitahuan penundaan antara aktivasi dan de-aktivasi aplikasi dan di tab pertama yang dibuat setelah periode aktivitas. Itu selalu membuat saya berpikir bahwa itu adalah tentang halaman memori yang dipindahkan.
Dalam kasus saya, setelah mencoba atas pada mesin bekerja tanpa hasil, saya menemukan bahwa pelakunya adalah Active Directory. Perbaikan itu untuk pergi ke Direktori Utilitas dan menyunting pengaturan layanan (double-klik pada "Active Directory") untuk mengaktifkan "Buat akun ponsel di login":
Ini rupanya penyebab IKLAN mandat untuk menjadi cache lokal, sehingga sistem tidak lagi memiliki untuk pergi ke server setiap kali mencoba untuk memvalidasi password anda.
Anda bisa mendapatkan ke Direktori Utilitas dengan Sorotan atau melalui "Pilihan Login" bagian dari System Preferences / Pengguna & Kelompok (pilih "Edit..." tombol di samping untuk "Akun Jaringan Server"):
Mengurangi sejarah anda untuk sesuatu antara 4 dan 10 ribu baris dan mungkin mencoba berhenti dan membuang semua diselamatkan windows. Saya telah melihat kedua membuat perbedaan lebih lambat pada mesin - terutama orang-orang tanpa SSD untuk penyimpanan.
Hanya menjalankan:
sudo creatbyproc.d
sudo newproc.d
di terminal yang terpisah dan terbuka baru terbuka untuk melihat apa yang sedang dijalankan selama waktu itu.
Jika tidak ada yang jelas, coba yang berikut ini:
sudo dtruss -an Terminal
Ini akan menampilkan semua rincian yang terjadi di tab waktu loading.