monit: kiểm tra quá trình mà không có pidfile


36

Tôi đang tìm cách để giết tất cả các quy trình với một tên cụ thể đã chạy trong hơn X lượng thời gian. Tôi sinh ra nhiều trường hợp thực thi đặc biệt này, và đôi khi nó rơi vào trạng thái xấu và chạy mãi mãi, chiếm rất nhiều cpu.

Tôi đã sử dụng monit, nhưng tôi không biết cách kiểm tra quy trình mà không có tệp pid. Quy tắc sẽ là một cái gì đó như thế này:

kill all processes named xxxx that have a running time greater than 2 minutes

Làm thế nào bạn sẽ thể hiện điều này trong monit?


( bạn nên đánh dấu một câu trả lời ở đây )
ewwhite

Câu trả lời:


80

Trong monit, bạn có thể sử dụng một chuỗi phù hợp cho các quy trình không có PID. Sử dụng ví dụ về một quy trình có tên "my Processname",

check process myprocessname
        matching "myprocessname"
        start program = "/etc/init.d/myproccessname start"
        stop program = "/usr/bin/killall myprocessname"
        if cpu usage > 95% for 10 cycles then restart

Có thể nếu bạn kiểm tra xem liệu tải CPU có ở một mức nhất định trong 10 chu kỳ giám sát (mỗi chu kỳ 30 giây) hay không, sau đó khởi động lại hoặc tắt, đó có thể là một tùy chọn. Hoặc bạn có thể sử dụng thử nghiệm dấu thời gian của monit trên một tệp liên quan đến quy trình.


1
Hãy cẩn thận: nó sẽ không hoạt động nếu có nhiều hơn một quá trình
ruX

1
bạn có thể sử dụng regrec: matchin "other ware. * my Processname"
user174962

@ruX: điều gì xảy ra nếu nhiều quá trình liên quan khớp nhau? Làm thế nào họ có thể xử lý?
kontextify

Nó có trận đấu đầu tiên.
ewwhite

5

Không có công cụ sẵn sàng sử dụng với chức năng đó. Giả sử bạn muốn giết các tập lệnh php-cgi, chạy lâu hơn phút. Làm cái này:

pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill

pgrepsẽ chọn các quy trình theo tên, ps -o pid,timein thời gian chạy cho mỗi pid và sau đó phân tích dòng, trích xuất thời gian từ nó và in pid nếu thời gian so sánh với thời gian xác định. kết quả thông qua để giết.


quá trình chạy trong thời gian rất dài có thời gian chạy lạ (62-13: 53: 05), vì vậy thời gian chạy phân tích cú pháp regrec phải là ([-0-9] +: [0-9] +: [0-9] + ) - nhìn vào dấu trừ ở đầu biểu thức.
andrej

3

Tôi đã giải quyết vấn đề chính xác này với ps-watcher và đã viết về nó trên linux.com vài năm trước. ps-watcher cho phép bạn theo dõi các quy trình và tiêu diệt chúng dựa trên thời gian chạy tích lũy. Đây là cấu hình ps-watcher có liên quan, giả sử quy trình của bạn được đặt tên là 'foo':

[foo]
  occurs = every
  trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
  action = <<EOT
  echo "$command accumulated too much CPU time" | /bin/mail user\@host
  kill -TERM $pid
EOT

[foo?]
   occurs = none
   action = /usr/local/etc/foo restart

Chìa khóa là dòng

trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`

trong đó nói rằng 'nếu thời gian xử lý tích lũy là> 1 giờ VÀ tôi không phải là quá trình cha mẹ, hãy khởi động lại tôi.

Vì vậy, tôi nhận ra rằng câu trả lời không sử dụng monit, nhưng nó hoạt động. ps-watcher rất nhẹ và đơn giản để thiết lập, vì vậy không có hại gì khi chạy nó ngoài cài đặt monit của bạn.



0

Bạn có thể làm việc này thành monit như một câu lệnh exec.

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
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.