0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Cách sử dụng lệnh timeout trên macOS mà không cần GNU Coreutils

Đăng vào 1 tháng trước

• 3 phút đọc

Giới thiệu

Khi viết một script shell trên macOS, tôi đã gặp một vấn đề nhỏ nhưng bất ngờ: không có lệnh timeout tích hợp sẵn. Nếu bạn đã từng làm việc với Linux, có lẽ bạn đã quen với lệnh timeout, một phần của GNU coreutils, rất hữu ích khi bạn muốn giới hạn thời gian chạy của một lệnh.

Trên macOS, tình hình lại khác. macOS đi kèm với bộ công cụ core utilities theo kiểu BSD, và phiên bản timeout của GNU đơn giản là không có sẵn. Phản ứng đầu tiên của tôi là cài đặt GNU coreutils thông qua Homebrew:

bash Copy
brew install coreutils

Nhưng điều này đi kèm với một vấn đề. Để tránh xung đột với các lệnh BSD có sẵn trên macOS (như lscat), Homebrew cài đặt GNU coreutils dưới các tên có tiền tố g. Vậy là thay vì ls, bạn nhận được gls; thay vì timeout, bạn nhận được gtimeout.

Điều này không vấn đề gì nếu bạn làm việc trong môi trường cá nhân, nhưng nó tạo ra rắc rối khi viết các script shell có thể di động. Nếu tôi viết một script gọi gtimeout trên macOS, nó sẽ không chạy ngay lập tức trên Linux, nơi mà lệnh chỉ đơn giản là timeout. Homebrew cung cấp cách để loại bỏ tiền tố g, nhưng đó là một giải pháp khá nặng nề—đột nhiên các công cụ mặc định trên hệ thống của bạn như ls, cat, và những công cụ khác bị thay thế bằng phiên bản GNU, có thể gây ra các vấn đề không mong muốn.

Thay vì đi theo con đường đó, tôi quyết định xây dựng một lệnh timeout độc lập, hoạt động như phiên bản của GNU nhưng không mang theo toàn bộ gói coreutils. Bằng cách này, bạn có thể cài đặt chỉ những gì bạn cần mà không lo về các tác dụng phụ.

Dự án Open Source

Dự án này là mã nguồn mở và bạn có thể tìm thấy tại đây:
👉 https://github.com/aisk/timeout

Để dễ dàng hơn trong việc cài đặt, tôi cũng đã thiết lập một Homebrew tap. Bạn có thể cài đặt trực tiếp bằng lệnh:

bash Copy
brew install aisk/homebrew-tap/timeout

Kết luận

Vậy là bạn sẽ có một phiên bản thay thế cho timeout, không có tiền tố g, và không cần phải thay thế các công cụ hệ thống khác. Tôi tạo ra công cụ này chủ yếu để giải quyết vấn đề của riêng mình, nhưng nếu nó giúp ích cho bạn, tôi rất biết ơn nếu bạn dành một ngôi sao cho repo trên GitHub. Mọi sự ủng hộ đều có ý nghĩa lớn và giúp tôi duy trì dự án này.

Những thực tiễn tốt nhất

  • Kiểm tra lệnh: Trước khi sử dụng, hãy chắc chắn rằng bạn đã cài đặt Homebrew và các công cụ cần thiết khác.
  • Sử dụng script di động: Khi viết script, hãy đảm bảo rằng bạn không phụ thuộc vào các lệnh có tiền tố g để nó có thể chạy trên nhiều hệ điều hành khác nhau.

Những cạm bẫy phổ biến

  • Cài đặt không đúng cách: Đảm bảo bạn làm theo các bước cài đặt chính xác để tránh xung đột lệnh.
  • Không kiểm tra phiên bản: Hãy luôn kiểm tra phiên bản của lệnh timeout bạn đang sử dụng để đảm bảo tính tương thích.

Mẹo hiệu suất

  • Giới hạn thời gian hợp lý: Đặt thời gian hợp lý cho các lệnh để tránh việc thực thi không cần thiết.
  • Tối ưu hóa lệnh gọi: Khi gọi các lệnh, hãy sử dụng các tham số thích hợp để tối ưu hóa hiệu suất.

Hỏi đáp thường gặp (FAQ)

  1. Tại sao tôi không thấy lệnh timeout trên macOS?
    Trên macOS, lệnh timeout không được cài sẵn vì hệ điều hành sử dụng bộ công cụ BSD thay vì GNU.

  2. Làm thế nào để cài đặt lệnh timeout?
    Bạn có thể sử dụng Homebrew để cài đặt lệnh bằng cách chạy brew install aisk/homebrew-tap/timeout.

  3. Có cách nào khác để giới hạn thời gian của lệnh không?
    Nếu không muốn cài đặt, bạn có thể sử dụng các giải pháp khác như &wait trong shell, nhưng chúng không mạnh mẽ như lệnh timeout.

Tài nguyên tham khảo

Hy vọng bài viết này sẽ giúp ích cho bạn trong việc xử lý các vấn đề liên quan đến lệnh timeout trên macOS!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào