Liên hệProfile
Danh mục

Mục Lục

    Tìm hiểu về lệnh time và timeout Linux chi tiết từ A – Z

    Nguyễn Hưng

    Ngày đăng:

    30/10/2025

    Cập nhật lần cuối:

    30/10/2025

    Lượt xem:
    Chia sẻ
    Đánh giá
    5/5 - (2 bình chọn)

    Nguyễn Hưng

    Lượt xem:
    Ngày đăng:

    30/10/2025

    Cập nhật lần cuối:

    30/10/2025

    Mục lục

    Lệnh time và timeout trong Linux là hai công cụ dòng lệnh mạnh mẽ giúp bạn làm chủ các tiến trình. Time Linux cho phép đo lường chính xác hiệu năng thực thi, trong khi timeout Linux đảm bảo một tác vụ không chạy quá giới hạn, ngăn ngừa sự cố treo hệ thống. Trong bài viết này, mình sẽ hướng dẫn bạn cách sử dụng hai lệnh này để tối ưu hóa script và bảo vệ tài nguyên hệ thống.

    Những điểm chính

    • Tìm hiểu lệnh time Linux: Nắm vững cách đo lường hiệu suất, phân tích các chỉ số (real, user, sys) và xác định các điểm nghẽn trong script.
    • Tìm hiểu lệnh timeout Linux: Học cách giới hạn thời gian thực thi, ngăn chặn tiến trình bị treo và áp dụng vào các kịch bản tự động hóa an toàn.
    • Giải đáp thắc mắc cho các vấn đề thường gặp, từ việc phân biệt các phiên bản lệnh đến cách xử lý khi timeout không hiệu quả.

    Lệnh time Linux là gì?

    Lệnh time Linux là một tiện ích dòng lệnh dùng để đo lường tổng thời gian cần thiết để một lệnh khác thực thi. Time cung cấp một báo cáo chi tiết về việc sử dụng tài nguyên CPU mà tiến trình đó đã sử dụng như thời gian thực, thời gian người dùng, thời gian hệ thống,… giúp đánh giá hiệu suất xử lý và tối ưu hóa các tập lệnh hoặc chương trình.

    Lệnh time trong Linux
    Lệnh time trong Linux

    Cú pháp cơ bản của lệnh time

    time [lệnh cần đo]

    Các thông số chính của lệnh time Linux

    Khi thực thi, time sẽ trả về ba giá trị thời gian cốt lõi:

    Thông sốÝ nghĩa
    realThời gian thực tế: Đây là tổng thời gian từ lúc lệnh bắt đầu cho đến khi kết thúc, tính theo đồng hồ, bao gồm cả thời gian CPU xử lý và thời gian chờ các tác vụ khác (như i/o, đợi mạng).
    userThời gian người dùng: Là tổng thời gian CPU đã dành để thực thi mã của lệnh trong chế độ người dùng, không bao gồm các tác vụ của nhân hệ điều hành.
    sysThời gian hệ thống: Là tổng thời gian CPU đã dành để thực thi các lệnh gọi hệ thống cho nhân (kernel) thay mặt cho lệnh đó.

    Ví dụ cụ thể

    Bạn có thể xem một ví dụ đơn giản dưới đây:

    time sleep 5

    Kết quả:

    real    0m5.002s
    user    0m0.001s
    sys     0m0.001s
    Ví dụ về kết qủa lệnh time
    Ví dụ về kết quả lệnh time

    Phân tích:

    • real là ~5 giây, đúng bằng thời gian chúng ta yêu cầu lệnh sleep.
    • usersys gần như bằng 0 phản ánh rằng trong suốt 5 giây thực thi, tiến trình sleep không thực hiện hoạt động nào đáng kể liên quan đến xử lý CPU. Thời gian này hoàn toàn dành cho trạng thái chờ, không phát sinh tải lên bộ xử lý.

    Khi chỉ số real lớn hơn đáng kể so với tổng của user và sys (real >> (user + sys)), điều này chứng tỏ chương trình phần lớn thời gian thực thi lại dành cho trạng thái chờ. Các tình huống chờ phổ biến gồm:

    • Đợi phản hồi từ mạng.
    • Đợi truy xuất dữ liệu từ các thiết bị lưu trữ có tốc độ thấp.
    • Chờ một tiến trình khác hoàn thành nhiệm vụ.

    Dấu hiệu này giúp bạn nhận diện rõ ràng điểm nghẽn về hiệu suất không phải do tính toán, mà chủ yếu phát sinh từ thao tác I/O hoặc phụ thuộc vào các thành phần ngoài CPU.

    Các phiên bản lệnh time trên Linux

    Trên hệ điều hành Linux, lệnh time tồn tại dưới ba dạng chính:

    • Shell built-in trong Bash: Lệnh time được tích hợp sẵn, sử dụng cú pháp gọn và cho ra ba chỉ số cơ bản (real, user, sys).
    • Shell built-in trong Zsh: Tương tự Bash, có cú pháp và đầu ra khác biệt một chút.
    • GNU time (external command): Một chương trình riêng biệt nằm tại /usr/bin/time, cho phép xuất báo cáo chi tiết hơn, hỗ trợ tùy biến định dạng output rất mạnh mẽ và nhiều tuỳ chọn nâng cao như ghi log ra file, hiển thị số lượng bộ nhớ tối đa tiêu thụ, số lần page faults,…
    Các phiên bản lệnh time trên Linux
    Các phiên bản lệnh time trên Linux

    Để biết hệ thống của bạn đang sử dụng lệnh time nào, bạn thực hiện lệnh sau:

    type time

    Các trường hợp phổ biến:

    • time is a shell keyword (Bash built-in)
    • time is a reserved word (Zsh built-in)
    • time is /usr/bin/time (GNU time)

    Nếu muốn dùng GNU time trong môi trường mặc định là Shell built-in, bạn hãy điền rõ đường dẫn đầy đủ (/usr/bin/time) hoặc dùng cú pháp \time <COMMAND>.

    Ứng dụng thực tế

    time là công cụ được ứng dụng phổ biến trong các trường hợp sau:

    • Tối ưu hóa mã lệnh và script: Đo lường hiệu suất trước và sau khi thay đổi code để xác nhận việc tối ưu có thực sự hiệu quả hay không.
    • Chẩn đoán hiệu năng hệ thống: Xác định một tác vụ chạy chậm là do CPU xử lý kém (user/sys cao) hay do phải chờ đợi tài nguyên mạng/ổ đĩa (real cao).
    • So sánh hiệu quả các công cụ: Chạy time trên nhiều lệnh khác nhau (ví dụ: grepawk) để xem lệnh nào xử lý một tác vụ nhanh hơn.
    • Kiểm tra hiệu năng phần cứng: Đánh giá tốc độ đọc/ghi của ổ đĩa hoặc hiệu suất mạng bằng cách đo thời gian thực thi các lệnh liên quan.

    Lệnh timeout Linux là gì?

    Lệnh timeout trong Linux là một tiện ích cho phép bạn thực thi một lệnh khác với một giới hạn thời gian cụ thể. Nếu lệnh đó không hoàn thành trong khoảng thời gian đã định, timeout sẽ tự động gửi tín hiệu (mặc định là SIGTERM) để kết thúc lệnh đó. Đây là công cụ cực kỳ hữu ích để quản lý các tác vụ có nguy cơ bị treo hoặc chạy vô hạn.

    Khái niệm lệnh timeout
    Khái niệm lệnh timeout

    Cú pháp:

    timeout [TÙY_CHỌN] DURATION LỆNH [ĐỐI_SỐ]

    Trong đó:

    • DURATION: Khoảng thời gian chờ, tính bằng giây theo mặc định. Bạn có thể sử dụng các hậu tố khác như m (phút), h (giờ), d (ngày). Ví dụ: 5 (5 giây), 2m (2 phút), 1h (1 giờ).
    • LỆNH: Lệnh mà bạn muốn chạy với giới hạn thời gian.
    • [ĐỐI_SỐ]: Các đối số cho lệnh đó.

    Các tùy chọn của lệnh timeout

    Tùy chọnChức năngVí dụ
    [THỜI GIAN]Thời gian giới hạn cho lệnh. Có thể được chỉ định bằng giây (mặc định), hoặc kèm theo đơn vị.timeout 5s ./script.sh – Chạy script.sh trong 5 giây.
    -s [TÍN HIỆU] hoặc --signal=[TÍN HIỆU]Chỉ định tín hiệu sẽ được gửi tới lệnh con khi hết thời gian. Mặc định là SIGTERM (tín hiệu kết thúc thân thiện).timeout -s SIGKILL 10s ./process – Sau 10 giây, nếu lệnh chưa xong, gửi tín hiệu SIGKILL (kết thúc cưỡng bức).
    -k [THỜI GIAN] hoặc --kill-after=[THỜI GIAN]Chỉ định thời gian chờ sau khi gửi tín hiệu đầu tiên (thường là SIGTERM) trước khi gửi tín hiệu SIGKILL.timeout -k 5s 30s ./long_task – Chạy 30 giây. Nếu chưa xong, gửi SIGTERM. Chờ thêm 5 giây. Nếu vẫn chưa xong, gửi SIGKILL.
    --preserve-statusKhi lệnh bị timeout, timeout sẽ thoát với mã trạng thái 124 (mã mặc định cho timeout). Tùy chọn này giữ lại mã trạng thái thực của lệnh con.Hữu ích khi bạn muốn phân biệt rõ ràng giữa việc lệnh bị timeout và lệnh hoàn thành nhưng thất bại.
    --foregroundKhông tạo nhóm quy trình mới. Lệnh con được chạy trực tiếp trong nền trước, giúp xử lý tín hiệu dễ dàng hơn.Thường cần thiết khi chạy timeout trong môi trường shell script phức tạp.

    Ví dụ cụ thể

    # Chỉ cho phép lệnh ping chạy trong tối đa 5 giây
    timeout 5s ping google.com
    Timeout cho phép lệnh ping chạy trong tối đa 5 giây
    Timeout cho phép lệnh ping chạy trong tối đa 5 giây
    # Chỉ bắt gói tin trên cổng 80 trong 2 phút, sau đó tự động dừng
    timeout 2m tcpdump -i eth0 port 80 -n

    Ứng dụng thực tế

    timeout là thường được ứng dụng phổ biến trong các trường hợp sau:

    • Lập trình Bash Shell: Khi viết script tự động hóa, việc đặt timeout cho các lệnh kết nối mạng như ssh, scp, curl, wget là bắt buộc để ngăn script của bạn bị treo vô thời hạn nếu máy chủ đích không phản hồi.
    • Bảo vệ tài nguyên khi kiểm thử: Việc bạn benchmark mạng bằng iperf3 hoặc thực hiện stress test có thể gây quá tải hệ thống và không thể SSH vào để dừng lại. Do đó việc bạn đặt một timeout (ví dụ timeout 10m iperf3 ...) sẽ đảm bảo bài test tự kết thúc và trả lại quyền kiểm soát cho bạn.
    • Trong CI/CD Pipeline: Bạn cần đảm bảo một bước build hoặc test không chạy quá lâu, tránh lãng phí tài nguyên và thời gian của cả hệ thống.
    • Quản lý các tác vụ không xác định: Thực thi một lệnh trên các file đầu vào không đáng tin cậy, timeout hoạt động như một cơ chế an toàn để chống lại các vòng lặp vô hạn.
    Bạn cần đảm bảo một bước build hoặc test không chạy quá lâu
    Bạn cần đảm bảo một bước build hoặc test không chạy quá lâu (Nguồn: Internet)

    Câu hỏi thường gặp

    Lệnh time trong Bash và GNU time có giống nhau không?

    Không giống nhau. Bash (hoặc Zsh) cung cấp lệnh time tích hợp sẵn với chức năng cơ bản, trong khi GNU time (/usr/bin/time) là một chương trình đầy đủ, hỗ trợ nhiều tuỳ chọn nâng cao như ghi log, định dạng báo cáo. Để kiểm tra bản đang dùng, bạn gõ: type time
    Nếu kết quả là “shell keyword” thì đó là bản built-in; còn là một đường dẫn thì đó là GNU time.

    Tại sao tiến trình vẫn chưa kết thúc mặc dù đã sử dụng timeout?

    Nguyên nhân có thể do tiến trình không phản hồi với tín hiệu SIGTERM mặc định. Bạn nên kết hợp thêm tham số --kill-after để buộc tiến trình bị dừng hoàn toàn bằng tín hiệu mạnh hơn, ví dụ SIGKILL.
    timeout -k 5s 10s sleep 20
    Lệnh này sẽ chờ 10 giây gửi SIGTERM, nếu tiến trình vẫn chạy sẽ gửi tiếp SIGKILL sau 5 giây nữa.

    Làm thế nào để kiểm tra nguyên nhân lệnh bị dừng khi dùng timeout?

    Để kiểm tra nguyên nhân, bạn hãy kiểm tra mã thoát (exit code) của lệnh ngay sau khi thực thi bằng lệnh echo $?.
    – Mã thoát 124: Lệnh bị timeout dừng do hết thời gian quy định.
    – Mã thoát 0: Lệnh đã tự hoàn thành thành công trước khi hết giờ.
    – Mã thoát khác (1, 2, …): Lệnh đã tự kết thúc (thường là do lỗi) trước khi hết thời gian.

    Hai lệnh time và timeout là công cụ không thể thiếu khi cần kiểm soát, đo lường và giới hạn thời gian thực thi trong Linux. Sử dụng đúng cách, người quản trị hoặc lập trình viên sẽ dễ dàng đánh giá hiệu suất, xác định điểm nghẽn, chủ động xử lý các tiến trình chạy quá lâu hoặc ngốn tài nguyên, đồng thời tối ưu hóa kịch bản tự động hóa và bảo vệ hệ thống hiệu quả.

    5/5 - (2 bình chọn)
    Nguyễn Hưng
    Tôi là Nguyễn Hưng hay còn được biết đến với nickname là Bo, chuyên gia về hệ thống, mạng và bảo mật. Tôi là Co-Founder của Vietnix và Co-Founder của dự án Chống Lừa Đảo.
    0 0 đánh giá
    Đánh giá bài viết
    Theo dõi
    Thông báo của
    guest
    0 Góp ý
    Cũ nhất
    Mới nhất Được bỏ phiếu nhiều nhất
    Phản hồi nội tuyến
    Xem tất cả bình luận

    BÀI VIẾT LIÊN QUAN

    Hướng dẫn sử dụng lệnh watch trong Linux để giám sát tiến trình hiệu quả
    Hướng dẫn sử dụng lệnh watch trong Linux để giám sát tiến trình hiệu quả

    Lệnh watch Linux là một công cụ dòng lệnh mạnh mẽ giúp bạn tự động thực thi lặp lại một lệnh bất kỳ theo chu kỳ. Thay vì phải gõ lại lệnh liên tục để xem sự thay đổi, watch sẽ cập nhật kết quả ngay trên màn hình của bạn. Bài viết này sẽ…

    30/10/2025

    Hướng dẫn kỹ thuật backup dữ liệu real-time bằng cách kết hợp tar và netcat
    Hướng dẫn kỹ thuật backup dữ liệu real-time bằng cách kết hợp tar và netcat

    Kỹ thuật nén và chuyển file backup real-time bằng tar nc là phương pháp sử dụng hai công cụ dòng lệnh phổ biến trong hệ điều hành Linux để nén dữ liệu và truyền trực tiếp giữa hai máy chủ mà không cần tạo ra file trung gian trên server nguồn. Trong bài viết này,…

    30/10/2025

    Hướng dẫn sao lưu dữ liệu trực tiếp qua mạng bằng tar qua SSH khi server đầy bộ nhớ
    Hướng dẫn sao lưu dữ liệu trực tiếp qua mạng bằng tar qua SSH khi server đầy bộ nhớ

    Khi ổ cứng đầy, giải pháp tốt nhất là bạn nên kết hợp tar và ssh để tạo một pipepline truyền dữ liệu trực tiếp qua mạng mà không cần lưu trữ trung gian. Bài viết này sẽ hướng dẫn chi tiết từng bước thực hiện backup bằng tar SSH trong điều kiện tài nguyên…

    30/10/2025

    Cách dùng Multitail để phân tích và đọc log chính xác, đơn giản
    Cách dùng Multitail để phân tích và đọc log chính xác, đơn giản

    Multitail là một công cụ dòng lệnh mạnh mẽ trên Linux giúp hiển thị nhiều file log hoặc output của nhiều lệnh khác nhau trên cùng một màn hình terminal, với khả năng chia nhỏ cửa sổ linh hoạt và các tính năng vượt trội so với lệnh tail truyền thống. Trong bài viết này,…

    30/10/2025