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
timeLinux: 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
timeoutLinux: 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
timeoutkhông hiệu quả.
Tìm hiểu về lệnh time Linux
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.

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 |
|---|---|
| real | Thờ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). |
| user | Thờ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. |
| sys | Thờ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 5Kết quả:
real 0m5.002s
user 0m0.001s
sys 0m0.001s
Phân tích:
reallà ~5 giây, đúng bằng thời gian chúng ta yêu cầu lệnhsleep.uservàsysgầ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,…

Để 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 timeCá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ụ:
grepvàawk) để 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.
Tìm hiểu về lệnh timeout Linux
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.

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ọn | Chức năng | Ví 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-status | Khi 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. |
--foreground | Khô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
# 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
timeoutcho các lệnh kết nối mạng nhưssh,scp,curl,wgetlà 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
iperf3hoặ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ộttimeout(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.

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 timeNế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 20Lệ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ả.




