Tôi có thể giới hạn một quy trình trong một khoảng thời gian nhất định / chu kỳ CPU không?


16

Chúng tôi có một tập lệnh chạy trên các máy chủ web của chúng tôi, được kích hoạt bởi hành động của khách hàng, khởi tạo quy trình unix để tạo một số tệp bộ đệm. Bởi vì quá trình này tác động đến các tệp do khách hàng của chúng tôi cung cấp, đôi khi nó hoạt động sai, chạy quá lâu đến nỗi quá trình PHP sinh ra nó hết thời gian hoặc sử dụng quá nhiều thời gian CPU mà một sysadmin sẽ giết chết nó.

Có lệnh nào tôi có thể chạy để giới hạn thời gian / thời gian chạy CPU của quá trình không? Tôi đang tìm kiếm một lệnh như /usr/bin/time, nơi tôi có thể chạy lệnh đó và truyền cho nó dòng lệnh tôi muốn nó chạy và giới hạn.

Câu trả lời:


13

Ngoài câu trả lời của Gilles còn có công cụ cpulimit thực hiện chính xác những gì bạn muốn - bao gồm sửa đổi trong thời gian chạy. Ngoài ra, nó có thể giới hạn chỉ một số CPU / Lõi IIRC nhất định.


12

Từ trong một chương trình, gọi setrlimit(RLIMIT_CPU, ...). Từ shell, gọi ulimit -t 42(đây không phải là tiêu chuẩn nhưng được hỗ trợ bởi hầu hết các shell (bao gồm bash và ksh) trên hầu hết các biến thể unix). Điều này khiến quá trình hiện tại bị hủy khi nó đã sử dụng hết N giây thời gian của CPU. Các giới hạn được kế thừa bởi các quá trình con. Một thành ngữ shell phổ biến là (ulimit -t 42; runaway_process)nếu bạn muốn có thể chạy các tiến trình không giới hạn khác sau đó từ cùng một shell.

Xem thêm Có cách nào để giới hạn dung lượng bộ nhớ mà một quy trình cụ thể có thể sử dụng trong Unix không? . Nguyên tắc là như nhau, bạn chỉ giới hạn một tài nguyên khác.


Vấn đề là, tôi không có mã nguồn cho chương trình nên tôi không thể thêm setrlimitvà tôi sinh ra nó thông qua PHP để tôi không có vỏ ...
Josh

6
@Josh: Nếu bạn đang tìm kiếm một cấu trúc tương tự time php /cgi/foo.php, bạn có thể sử dụng bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- ngừng trở nên xấu xa'

@Josh apache? Ngoài ra, tôi nghĩ rằng công cụ này có thể được thiết lập toàn hệ thống ...
xenoterracide

@xenoterracide vâng, đó là Apache, nhưng tôi chỉ muốn giới hạn một quy trình này, không phải tất cả các quy trình apache. Bash oneliner của Gilles có thể hoạt động tuyệt vời!
Josh

3

Bạn cũng có thể sử dụng timeoutlệnh để chặn một quá trình chạy lâu hơn một khoảng thời gian được chỉ định.

thí dụ

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

Xem trang thời gian chờ để biết thêm chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.