2012-04-19 36 views
95

thể trùng lặp:
Bash script that kills a child process after a given timeoutLàm thế nào để chạy một tiến trình với thời gian chờ trong Bash?

Có cách nào để viết một kịch bản shell sẽ thực hiện một lệnh nào đó trong vòng 15 giây, sau đó giết lệnh?

Tôi đã thử ngủ, chờ và ping nhưng có thể tôi đang sử dụng sai.

+2

Thông thường bạn sử dụng tín hiệu ALARM và bẫy nó. Nhưng tiện ích lệnh [timelimit] (http://devel.ringlet.net/sysutils/timelimit/) có vẻ đầy hứa hẹn. – Konerak

+0

người bỏ phiếu này là ngoại tuyến? :/ –

Trả lời

43

Bạn có thể tạo nền cho quy trình và PID của nó đi vào $!. Sau đó, ngủ và giết:

some_command some_arg1 some_arg2 & 
TASK_PID=$! 
sleep 15 
kill $TASK_PID 

Tại this URL Tôi thấy có nhiều giải pháp để thực hiện điều này.

+3

Ban đầu tôi đã xóa câu trả lời của mình (bởi vì, rõ ràng, của Karoly là tuyệt vời hơn nhiều), nhưng có vẻ như một số người không có 'timeout' => undeleted. – ArjunShankar

190

Sử dụng timeout lệnh:

timeout 15s command 

Lưu ý: trên một số hệ thống bạn cần phải cài đặt coreutils, trên những người khác nó còn thiếu hoặc có đối số dòng lệnh khác nhau. Xem giải pháp thay thế được đăng bởi @ArjunShankar. Dựa trên nó, bạn có thể đóng gói mã đĩa nồi hơi đó và tạo tập lệnh timeout xách tay của riêng bạn hoặc ứng dụng C nhỏ hoạt động tương tự.

+3

chưa kể rằng nó sẽ trở lại ngay lập tức nếu lệnh kết thúc trước đó –

+0

Vì vậy, đối với lệnh Im cố gắng để giết sau 15 giây tôi đã thử bằng cách sử dụng lệnh này nhưng nó không ngừng lệnh chạy, tôi cũng đã cố gắng sử dụng timeout - k 15 và điều đó cũng không hoạt động: ( – AlanF

+0

đây là cách bạn ** chạy ** lệnh. –

Các vấn đề liên quan