2008-10-09 38 views
5

Tôi muốn một "hệ thống" theo dõi một quá trình và sẽ giết chết quá trình nói nếu:Tự động giết quá trình tiêu thụ quá nhiều bộ nhớ hay đứng trên linux

  • quá trình vượt quá một số yêu cầu bộ nhớ
  • quá trình không trả lời thư từ "hệ thống" trong một khoảng thời gian

Tôi cho rằng "hệ thống" này có thể đơn giản như một quy trình giám sát? Một ví dụ mã về cách thức này có thể được thực hiện sẽ hữu ích. Tôi tất nhiên không ngược với một giải pháp hoàn toàn khác cho vấn đề này.

Trả lời

9

Đối với yêu cầu đầu tiên, bạn có thể muốn xem xét hoặc sử dụng ulimit, hoặc tinh chỉnh các thiết lập oom-killer kernel trên hệ thống của bạn .

Trình theo dõi daemon tồn tại cho loại điều này. God là một ví dụ gần đây.

4

Để hạn chế sử dụng bộ nhớ của các quá trình, kiểm tra /etc/security/limits.conf

+0

Hoặc 'ulimit' (vỏ) hoặc 'setrlimit' (C). – ephemient

0

Các quy trình được giám sát mà bạn đang viết hay chỉ là bất kỳ quy trình nào?

Nếu chúng là các quy trình tùy ý thì có thể khó theo dõi phản hồi. Trừ khi quá trình này đã được thiết lập để xử lý và phản hồi các sự kiện mà bạn có thể gửi, thì tôi nghi ngờ bạn sẽ có thể theo dõi chúng. Nếu họ là các quy trình mà bạn đang viết, bạn cần phải thêm một số loại xử lý tin nhắn mà bạn có thể sử dụng kiểm tra chống lại.

1

Hãy thử Process Resource Monitor để theo dõi quy trình cổ điển, dễ sử dụng. Mã có sẵn theo GPL.

Có một vài tập lệnh theo dõi khác mà bạn cũng có thể thấy thú vị.

1

Nếu bạn muốn thiết lập hệ thống giám sát khá toàn diện, hãy kiểm tra monit. Nó có thể rất (rất RẤT RẤT RẤT) chatty ở lần, nhưng nó sẽ làm rất nhiều giám sát, khởi động lại dịch vụ, cảnh báo bạn, vv

Điều đó nói rằng, đừng ngạc nhiên nếu bạn đang nhận được hàng chục e-mail một ngày cho đến khi bạn quen với việc cấu hình nó và nói với nó những gì không làm phiền bạn.

5

Tôi đã viết một kịch bản mà chạy như một công việc định kỳ và có thể được tùy chỉnh để giết các quy trình vấn đề:

#!/usr/local/bin/perl 

use strict; 
use warnings; 
use Proc::ProcessTable; 

my $table = Proc::ProcessTable->new; 

for my $process (@{$table->table}) { 
    # skip root processes 
    next if $process->uid == 0 or $process->gid == 0; 

    # skip anything other than Passenger application processes 
    #next unless $process->fname eq 'ruby' and $process->cmndline =~ /\bRails\b/; 

    # skip any using less than 1 GiB 
    next if $process->rss < 1_073_741_824; 

    # document the slaughter 
    (my $cmd = $process->cmndline) =~ s/\s+\z//; 
    print "Killing process: pid=", $process->pid, " uid=", $process->uid, " rss=", $process->rss, " fname=", $process->fname, " cmndline=", $cmd, "\n"; 

    # try first to terminate process politely 
    kill 15, $process->pid; 

    # wait a little, then kill ruthlessly if it's still around 
    sleep 5; 
    kill 9, $process->pid; 
} 

http://blog.endpoint.com/2012/08/automatically-kill-process-using-too.html

+0

Liên kết đơn lẻ là [được coi là câu trả lời nghèo] (http://stackoverflow.com/faq#deletion) vì nó vô nghĩa bởi chính nó và tài nguyên đích không được đảm bảo sẽ còn sống trong tương lai. Vui lòng cố gắng bao gồm ít nhất tóm tắt thông tin bạn đang liên kết đến. – j0k

+0

điều này là tuyệt vời, tôi chỉ làm cho nó vô hạn lặp lại mỗi giây. –

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