OK Tôi có một kết luận tương tự với Darren, mặc dù cơ chế định hình hơi khác (đăng nhập chậm NB vẫn có thể xảy ra ở Yosemite).
Đây là một cách để nói những gì thực sự đang chạy khi bạn bắt đầu một cửa sổ đăng nhập mới, sử dụng lệnh profiler mẫu OS X.
Tìm hiểu những gì một lệnh thực thi đăng nhập bình thường
$ ps -ef | grep login
Bạn sẽ thấy một cái gì đó như login -pfl username /bin/bash -c exec -la bash /bin/bash
Tạo tên tệp tập lệnh profile_login.sh
với nội dung sau bằng cách thêm
-c ""
đến cuối lệnh được phát hiện để yêu cầu bash trả về ngay lập tức, với nội dung như sau:
login -pfl username /bin/bash -c exec -la bash /bin/bash -c "" &
sudo sample $! -mayDie # sample the above command
Làm cho nó thực thi
$ chmod u+x profile_login.sh
và chạy nó bằng sudo ( sample
lệnh yêu cầu nó)
$ sudo ./profile_login.sh
OK, hãy tiếp tục và chạy nó. Ví dụ bằng cách thực hiện purge
lệnh đầu tiên. Trên hộp của tôi, tôi có một biểu đồ đầu ra lớn. Tìm kiếm "các chi nhánh được đánh số lớn nhất" (thường ở trên cùng) tôi thấy hai người phạm tội lớn nhất sau đây :
Một trong những thứ được gọi là pam_start
xuất hiện để mở hình ảnh 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]
và điều đó đôi khi được theo sau bởi một người phạm tội khác 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]
Về cơ bản, có hai người phạm tội. Một là pam
(một số loại hệ thống xác thực) và loại khác là asl
"phát hiện thông tin đăng nhập mới nhất của bạn". Vì vậy, rõ ràng chỉ cần xóa các /private/var/log/asl/*.asl
tập tin của bạn là không đủ. Tải pam đắt hơn nhiều trên máy của tôi, dù sao thì [SSD]. Hãy chạy đoạn script trên và xem hệ thống của bạn có giống nhau không. Thật thú vị, mã nguồn cho các cuộc gọi phương thức này dường như cũng có sẵn trực tuyến, ví dụ openpam_dynamic
Nếu tôi làm theo câu trả lời của Darren và thay thế tùy chọn "shell mở bằng" của tôi thành một thứ khác ngoài / bin / bash, thì tôi sẽ thấy các dòng sau được sử dụng để bắt đầu các tab thiết bị đầu cuối mới:
$ ps -ef | grep login
... login -pfql packrd /bin/bash -c exec -la bash /usr/bin/bash
Vì vậy, nếu bây giờ tôi sử dụng sample
thủ thuật tương tự trên lệnh đăng nhập mới
login -pfql username /bin/bash -c exec -la bash /usr/bin/bash -c "" &
sudo sample $! -mayDie
một stacktrace nhỏ hơn nhiều được tạo ra, người phạm tội lớn nhất là:
+ 8 pam_end (in libpam.2.dylib) + 190 [0x7fff97294ebb]
+ ! 6 coresymbolication_unload_image(CSCppDyldSharedMemoryPage*, ImageLoader const*) (in dyld) + 143 [0x7fff6e0f634f]
Tôi nghĩ rằng điều này là do tham số "-q" đăng nhập hiện đang được sử dụng. Rõ ràng tham số này bỏ qua cả việc tải các mô-đun pam và tìm kiếm thời gian đăng nhập cuối cùng (cả hai người phạm tội). Theo các tài liệu của login
lệnh, chạm vào ~/.hushlogin
tệp sẽ làm điều tương tự, nhưng rõ ràng điều này không còn hoạt động nữa [ít nhất là đối với tôi với 10.10].
Vì vậy, tóm lại, loại bỏ /private/var/log/asl/*.asl là không đủ (trong thử nghiệm của tôi, nó chỉ chiếm tối đa 1/3 tốc độ chậm thực tế, mặc dù nếu bạn có các tập tin ở đó thì nó có thể chiếm tài khoản với tỷ lệ lớn hơn tôi chắc chắn).
Dù sao, sử dụng các tập lệnh tương tự, bạn sẽ có thể cho biết điều gì khiến máy cục bộ của bạn bị hỏng và xem cách khắc phục ở trên có áp dụng cho bạn không. Hãy bình luận ở đây.
CẬP NHẬT: dường như coresymbolication_load_image
vẫn có thể mất rất nhiều thời gian, ngay cả khi login -pfql
được gọi (có lẽ một số mô-đun xác thực pam hoặc khác đang phải "quay số" đến máy chủ đăng nhập trung tâm hoặc một số lẻ, vì vậy phải chờ phản hồi từ bên thứ 3 ). Vì vậy, cách giải quyết thực sự duy nhất tôi đã tìm thấy là sử dụng iTerm2 và thay đổi tùy chọn -> hồ sơ -> chung -> Lệnh để /bin/bash
thay thế.
.bash_profile
(cũng kiểm tra~/.profile
bằng cách này). Ngoài ra: lưu ý bạn có thể bắt đầu nhập trong khi bash đang tải và thông thường những gì bạn nhập sẽ được sao chép vào dấu nhắc lệnh khi nó sẵn sàng.