Câu trả lời này cho lệnh Dòng lệnh để tự động hủy lệnh sau một khoảng thời gian nhất định
đề xuất phương thức 1 dòng để hết thời gian chạy lệnh từ dòng lệnh bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Nhưng có thể một lệnh "chạy dài" nhất định có thể kết thúc sớm hơn thời gian chờ. (Chúng ta hãy gọi nó là lệnh "thường chạy dài nhưng đôi khi nhanh" hoặc tlrbsf cho vui.)
Vì vậy, cách tiếp cận 1-liner tiện lợi này có một vài vấn đề. Đầu tiên, sleep
không có điều kiện, do đó đặt giới hạn thấp hơn không mong muốn về thời gian thực hiện để chuỗi kết thúc. Cân nhắc 30 giây hoặc 2m hoặc thậm chí 5m cho giấc ngủ, khi lệnh tlrbsf kết thúc sau 2 giây - rất không mong muốn. Thứ hai, kill
là vô điều kiện, vì vậy trình tự này sẽ cố gắng giết một quá trình không chạy và than vãn về nó.
Vì thế...
Có cách nào để hết thời gian một lệnh thường chạy dài nhưng đôi khi nhanh ( "tlrbsf" ) mà
- có triển khai bash (câu hỏi khác đã có câu trả lời Perl và C)
- sẽ chấm dứt vào đầu của hai: chấm dứt chương trình tlrbsf hoặc hết thời gian
- sẽ không giết các quy trình không tồn tại / không chạy (hoặc, tùy chọn: sẽ không phàn nàn về việc giết người xấu)
- không phải là một lớp lót
- có thể chạy dưới Cygwin hoặc Linux
... và, đối với các điểm thưởng, chạy lệnh tlrbsf ở nền trước và bất kỳ 'giấc ngủ' hoặc quá trình bổ sung nào trong nền, sao cho lệnh stdin / stdout / stderr của lệnh tlrbsf có thể được chuyển hướng, giống như khi nó được chuyển hướng chạy trực tiếp?
Nếu vậy, xin vui lòng chia sẻ mã của bạn. Nếu không, hãy giải thích lý do tại sao.
Tôi đã dành một lúc để cố gắng hack ví dụ đã nói ở trên nhưng tôi đang đạt đến giới hạn về kỹ năng bash của mình.
timeout
tiện ích gnu ?
timeout
tuyệt! bạn thậm chí có thể sử dụng với nhiều lệnh (tập lệnh nhiều dòng): stackoverflow.com/a/61888916/658497