Làm cách nào để tăng tốc thời gian tải tab Terminal mới?


93

Làm thế nào tôi có thể tăng tốc khởi động thiết bị đầu cuối trong Lion?

Tôi không nói đến việc khởi động ứng dụng Terminal, mà là về các cửa sổ thiết bị đầu cuối khởi động, như khi tôi mở một tab mới.

Tôi không có bất cứ thứ gì trong tệp .bash_profile của mình và tôi chạy rm -rf /private/var/log/asl/*.aslcứ sau 4 giờ (điều này sẽ xóa các tệp thường làm cho thiết bị đầu cuối chậm).

Hiện tại, khi tôi mở một tab mới, phải mất 3-4 giây cho đến khi tôi có thể chạy một cái gì đó.


2
Có lẽ có điều gì khác sai với hệ thống của bạn? Nó không nên chậm như vậy. Đôi khi tôi mất một hoặc hai giây, nhưng thường thì đó chỉ là một phần giây. Và tôi có một chút công bằng .bash_profile(cũng kiểm tra ~/.profilebằ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.
Abhi Beckert

Bạn đang sử dụng tài khoản mạng hoặc thư mục nhà mạng? Terminal có phản ứng với đầu vào của người dùng trong khi nó tạo terminal không? Nó có hiển thị con trỏ bận quay không?
Trang Chris

1
Để tìm hiểu xem Terminal đang dành thời gian ở đâu, hãy mở Activity Monitor, chọn Terminal và nhấp vào nút thanh công cụ Process Process, sau đó ngay lập tức đi đến Terminal và tạo một cửa sổ / tab mới. Mẫu có thể cung cấp manh mối về thời gian đang diễn ra. Ngoài ra, hãy xem danh sách quy trình trong Trình giám sát hoạt động: nếu "đăng nhập" hoặc "bash" (hoặc bất kỳ vỏ nào bạn đang sử dụng) xuất hiện trong danh sách trong thời gian trễ, điều đó có nghĩa là sự chậm trễ có thể xảy ra ở một trong hai chương trình đó chứ không phải Thiết bị đầu cuối.
Chris Trang

Bạn đã kiểm tra biến PATH của mình chưa? Tôi nhận thấy rằng cái của tôi dài vô lý với nhiều lần lặp lại do một số tiện ích .bashrc khó hiểu. Tôi loại bỏ các lần lặp lại và mọi thứ tăng tốc!
190290000 Đồng rúp Man

Câu trả lời:


93

Câu trả lời ngắn:

Vấn đề được gây ra bởi một tra cứu nhật ký hệ thống ASL đắt tiền (có khả năng). Để thấy điều này trong thực tế, hãy chạy sudo fs_usage | grep 'asl.*login'trong cửa sổ Terminal, sau đó mở cửa sổ Terminal mới.

Để giải quyết vấn đề, hãy định cấu hình Terminal để khởi chạy trình bao không chuẩn:

  1. Tạo một symlink đến shell ưa thích của bạn. Ví dụ:sudo ln -s /bin/bash /usr/local/bin/bash
  2. Mở Terminal Preferences và chọn tab "General".
  3. Chọn "Shells mở bằng: Command" và nhập liên kết tượng trưng bạn đã tạo ở bước 1. Ví dụ "/ usr / local / bin / bash".

Lưu ý 1: Bạn cũng có thể cần thêm bash-bashvào danh sách quy trình tại "Tùy chọn đầu cuối> Cấu hình> Shell> Hỏi trước khi đóng".

Lưu ý 2: /usr/local/bincó thể ghi trong chế độ Rootless OS X 10.11 (El Capitan).

Để xác minh sửa lỗi:

  • Mở một cửa sổ Terminal mới.
  • "Đăng nhập lần cuối:" không nên được hiển thị ở trên cùng
  • Mở thanh tra (Command + I) và chọn tab Thông tin.
  • Lệnh nên đọc login -pfq username /usr/bin/bashhoặclogin -pfql username ...

Quan trọng: Nếu lệnh đăng nhập không bao gồm -qtham số, thì bạn chưa khắc phục được sự cố.

Bạn cũng có thể sử dụng sudo fs_usage | grep 'asl.*login'để xác minh rằng /var/log/aslkhông được truy cập khi mở cửa sổ Terminal mới.

Chi tiết:

Có một số lỗi chơi ở đây.

Nguyên nhân thực sự của sự chậm chạp là /usr/bin/login, theo mặc định sẽ hiển thị ngày đăng nhập cuối cùng của bạn. Để có được ngày đăng nhập cuối cùng này, nó tìm kiếm cơ sở dữ liệu ASL (Nhật ký hệ thống Apple) tại /var/log/asl/. Các tệp nhật ký này có thể bị phân mảnh rất nhiều và chính sự phân mảnh tệp này gây ra độ trễ khi mở một cửa sổ hoặc tab mới. (Lỗi 1)

Cách duy nhất để chặn tìm kiếm ASL cho lần đăng nhập cuối cùng là truyền -qtham số cho /usr/bin/login. Các .hushlogintập tin cũng sẽ ngăn chặn các "Last Đăng nhập" hiển thị, nhưng nó không ngăn chặn việc tìm kiếm ASL tốn kém. (Lỗi 2)

Terminal luôn sử dụng /usr/bin/loginđể khởi chạy mỗi cửa sổ / shell mới. Không có tùy chọn để khởi chạy shell trực tiếp cũng như không có cách nào để kiểm soát trực tiếp các tham số được truyền tới /usr/bin/login(Bug 3).

Khi nó bật ra, Terminal sẽ chuyển -qtham số đến /usr/bin/loginkhi nó được cấu hình để sử dụng shell không chuẩn . (Lỗi 4)

Các -qtham số là những gì chúng ta cần phải tránh vấn đề, vì thế mà liên kết tượng trưng đến /usr/local/bin/bash.


6
Bạn có biết tại sao -q được thêm vào nếu lệnh là liên kết tượng trưng đến / bin / bash nhưng không phải là / bin / bash không?
Lri

3
@LauriRanta Có vẻ như là một lỗi trong Terminal 10.7 và 10.8. Khi lệnh khởi động được đặt thành, /bin/bashnó sẽ hoạt động như thể Shell đăng nhập mặc định được chọn. Bất kỳ lệnh nào khác hơn /bin/bashsẽ hoạt động chính xác, vì vậy sử dụng / usr / bin / bash chỉ là một cách giải quyết. Lỗi này không có trong Snow Leopard.
Darren

5
@Darren bạn đã báo cáo lỗi đáng ngờ này cho Apple chưa? Nếu không, xin vui lòng bạn có thể làm như vậy thông qua: bugreport.apple.com
Graham Miln

3
Thật không may, điều này dẫn đến một quảng cáo về bash chạy mỗi khi bạn đóng thiết bị đầu cuối trên Yosemite. Vì vậy, không phải là một sửa chữa tốt đẹp :(
Claus Jørgensen

2
@ ClausJørgensen Tôi chưa gặp vấn đề đó. Bạn có thể muốn kiểm tra cài đặt "Shell" trong tab Cấu hình.
Darren

20

Điều tôi cần là thay đổi từ shell đăng nhập thành lệnh /bin/bash -il trong Tùy chọn> Cấu hình> Chung> Lệnh của iTerm .

Tôi cần tùy chọn -l( Tạo bash hoạt động như thể nó đã được gọi dưới dạng shell đăng nhập ) được thêm vào để đặt các biến môi trường từ~/.bash_profile


Việc dừng tìm kiếm đăng nhập của ASL theo câu hỏi được chấp nhận
user151019 11/07/2015

4
Trong tất cả các giải pháp, cái này hiệu quả với tôi. +50!
Bhavin Doshi

1
Thông tin tuyệt vời xung quanh trong chủ đề này! Đây là giải pháp tôi đã sử dụng vì nó không yêu cầu tạo liên kết tượng trưng hay bất cứ thứ gì. Thời gian khởi động shell mới của tôi đã chuyển từ ~ 5-10 giây sang tức thì với giải pháp này.
DustinB

16

.hushlogin

Tạo một tập tin trống trong thư mục nhà của bạn được gọi là .hushlogin; điều này sẽ giảm đáng kể thời gian để tab Terminal.app xuất hiện.

Bạn có thể tạo .hushlogintệp trong Terminal.app bằng lệnh sau:

touch ~/.hushlogin

Các tập tin sẽ có hiệu lực ngay lập tức.

Bạn có thể tìm hiểu thêm về .hushlogintệp và quy trình đăng nhập nói chung trong hướng dẫn đăng nhập .

Làm im lặng quá trình đăng nhập

Khi bạn tạo một tab Terminal mới, bạn đang trải qua quá trình đăng nhập. Quá trình này bao gồm tìm nạp thông tin khác nhau về phiên đăng nhập trước đó, tin nhắn trong ngày và hiển thị các thông báo hệ thống. Đây có thể là nguồn gốc của sự chậm trễ đáng kể. Hãy thử che giấu những tin nhắn này để xem sự chậm trễ biến mất.


6
.hushlogin không thực sự giải quyết vấn đề. Điều này có thể được xác nhận bằng cách sử dụng opensnoop. Xem câu trả lời của tôi dưới đây.
Darren

1
@Darrren: đăng nhập người đàn ông nói với tôi: -q Điều này buộc đăng nhập yên tĩnh, như thể có một .hushlogin. Tùy chọn q là những gì bạn nói ngăn chặn vấn đề, nhưng nó chỉ làm tương tự như với hushlogin.
Christian

8

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.shvớ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 ( samplelệ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 purgelệ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_startxuấ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/*.asltậ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 samplethủ 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 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 loginlệnh, chạm vào ~/.hushlogintệ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_imagevẫ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/bashthay thế.


1
Ngoài việc tra cứu ASL, sự chậm trễ trong đăng nhập thường xảy ra do trên mạng có máy chủ thư mục phản hồi chậm khi được hỏi về thông tin người dùng của bạn. Nếu bạn không ở trên mạng có dịch vụ thư mục được bật, thì tôi không biết điều gì khác sẽ làm mất thời gian đáng kể, ngoài tắc nghẽn hệ thống chung (sử dụng CPU, áp suất bộ nhớ, tắc nghẽn I / O).
Chris Trang

@ChrisPage Có lẽ một số dịch vụ thư mục mạng gì đó hoặc khác, mẹo hay.
rogerdpack

3

Đó là tất cả về việc điều tra nguyên nhân. Bạn có thể thấy những gì đang được thực hiện trong khi quá trình bắt đầu bằng cách nhập vào bash -x, nó sẽ in ra quá trình khởi động shell.

Cá nhân, tôi chỉ nhận thấy sự chậm trễ giữa kích hoạt và khử kích hoạt ứng dụng và trong tab đầu tiên được tạo sau một thời gian hoạt động. Nó luôn khiến tôi nghĩ rằng đó là về các trang bộ nhớ được di chuyển xung quanh.


2

Giảm lịch sử của bạn xuống thứ gì đó trong khoảng từ 4 đến 10 nghìn dòng và có thể thử bỏ và loại bỏ tất cả các cửa sổ đã lưu. Tôi đã thấy cả hai tạo ra sự khác biệt trên các máy chậm hơn - đặc biệt là những máy không có SSD để lưu trữ.


2

Trong trường hợp của tôi, sau khi thử những điều trên trên máy công việc của tôi mà không thành công, tôi thấy rằng thủ phạm là Active Directory. Cách khắc phục là vào Tiện ích thư mục và chỉnh sửa cài đặt dịch vụ quảng cáo (nhấp đúp vào "Thư mục hoạt động") để bật "Tạo tài khoản di động khi đăng nhập":

ảnh chụp màn hình của ứng dụng Directory Utility w / Cài đặt Active Directory mở

Điều này rõ ràng khiến thông tin đăng nhập AD được lưu trữ cục bộ, do đó hệ thống không còn phải ra máy chủ mỗi khi nó cố xác thực mật khẩu của bạn.

Bạn có thể truy cập Tiện ích thư mục bằng Spotlight hoặc thông qua phần "Tùy chọn đăng nhập" trong Tùy chọn hệ thống / Người dùng & Nhóm (chọn nút "Chỉnh sửa" bên cạnh "Máy chủ tài khoản mạng"):

Cửa sổ Người dùng & Nhóm hiển thị "Tùy chọn đăng nhập" và "Chỉnh sửa"


0

Chỉ cần chạy:

sudo creatbyproc.d
sudo newproc.d

trong các thiết bị đầu cuối riêng biệt và mở mở mới để xem những gì đang được thực hiện trong thời gian đó.

Nếu không có gì rõ ràng, hãy thử như sau:

sudo dtruss -an Terminal

Điều này sẽ in tất cả các chi tiết của bạn đang xảy ra trong thời gian tải tab.


0

Mở /etc/profilevà thêm dòng PATH=""để nó trông như thế này:

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

0

Vấn đề đối với tôi là máy chủ miền thư mục hoạt động không hợp lệ.

Thay đổi nó sau đó khởi động lại mac đã sửa nó.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.