Tìm (và giết) các quy trình cũ


10

Về cơ bản tôi cần có khả năng quét cây quy trình và tìm các quy trình khớp với một tên nhất định và bắt đầu chạy hơn một tuần một lần. Một khi tôi có chúng, tôi cần phải giết chúng. Tất cả các quy trình vẫn được xem như ở trạng thái chạy bởi hệ thống, chỉ cần không sử dụng bất kỳ thời gian hệ thống nào. Họ cũng sẽ thường ngồi mãi trong trạng thái này.

Lý tưởng nhất là tôi muốn một cái gì đó tương tự để tìm, nhưng cho các quy trình.

Hệ thống là Debian linux và hệ thống này sẽ được viết kịch bản và chạy bởi cron vì vậy tôi không có vấn đề thực sự với thứ gì đó lớn nhưng có thể hiểu được.


4
Làm thế nào để bạn phân biệt giữa các quy trình cũ nhưng quan trọng và những quy trình bạn muốn giết?
Chopper3

Câu trả lời:


9

YOu có thể làm điều này với sự kết hợp của ps, awk và kill:

ps -eo pid,etime,comm

Cung cấp cho bạn một đầu ra ba cột, với quy trình PID, thời gian trôi qua kể từ khi quá trình bắt đầu và tên lệnh, không có đối số. Thời gian trôi qua trông giống như một trong những điều sau:

mm:ss
hh:mm:ss
d-hh:mm:ss

Vì bạn muốn các quy trình đã chạy hơn một tuần, bạn sẽ tìm các dòng khớp với mẫu thứ ba đó. Bạn có thể sử dụng awk để lọc các tiến trình bằng cách chạy thời gian và theo tên lệnh, như thế này:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

sẽ in các pids của tất cả các lệnh khớp với 'mycommand' đã chạy hơn 7 ngày. Đặt danh sách đó vào kill và bạn đã hoàn thành:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9

Rất vui được cảm ơn. Hoàn toàn quên về các tùy chọn định dạng trong ps.
Ryaner

2
Điều này không hiển thị cho bạn các quy trình chạy "hơn 7 ngày". Nó cho bạn thấy các quy trình chạy trong vòng 7 ngày nhưng dưới 8 ngày.
hobodave

etimestiện dụng hơn - serverfault.com/a/393476/67675
poige

4

killall --quiet --older-than 1w process_name


1
Điều này hoạt động tuyệt vời trên Ubuntu 16.04 và bạn có thể sử dụng với cờ -i (tương tác) để kiểm tra và đảm bảo rằng nó nhắm mục tiêu vào các quy trình mà bạn nghĩ nó nên có.
ezwrighter

1

Tất cả các thông tin bạn cần có thể được lấy từ ps -ef. Xem cột "STIME". Kết hợp điều đó với grepđể sắp xếp các quy trình bạn cần. Tại thời điểm đó, bạn có thể sử dụng cutđể lấy pid của tất cả các quy trình khớp và chuyển chúng cho kill.

Vui lòng cho tôi biết nếu bạn muốn biết thêm chi tiết về cách thực hiện việc này.


Tôi muốn biết thêm chi tiết. Các câu trả lời khác chỉ đơn giản là không chính xác.
hobodave

1

nếu bạn đã root, để loại bỏ rác (/ Proc / fs Proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;

0

Khi một quá trình khởi động, nó sẽ tạo một thư mục trong hệ thống tập tin / Proc. Bạn có thể sử dụng lệnh find để nhận các thư mục cũ hơn 7 ngày và hủy các quy trình như sau:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

Điều này cũng không hoạt động. Vì nó tạo ra cảnh báo này và không có đầu ra bổ sung: find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Di chuyển -maxdepth là đầu ra đầu tiên mà nó không trả về quá trình nào và tôi khẳng định rằng nhiều kết quả sẽ phù hợp.
hobodave

còn tại sao mtime không ctime nếu bạn đang tìm kiếm ngày tạo của dir? Về mặt lý thuyết có thể được sửa đổi nếu một đứa trẻ bổ sung được tạo ra, điều mà tôi sẽ không loại trừ (có lẽ một mô-đun hạt nhân mới được tải sẽ mở rộng sysfs theo một cách nào đó)
jmtd

0

Không ai đề cập đến người theo dõi ps ở đây. Tôi nghĩ rằng bạn có thể so sánh $ start_time bằng cách sử dụng hàm elapsed2sec nhưng tôi không hoàn toàn chắc chắn. Đây là suy nghĩ đầu tiên của tôi:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

không biết nếu nó hoạt động, nhưng nó nên là một điểm khởi đầu tố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.