Cách tốt nhất để dọn dẹp sau một quả bom ngã ba là gì?


21
$ ls
bash: no more processes

À ồ. Hình như có ai đó đã làm một quả bom ngã ba. Nơi tôi từng làm việc, điều này khá nhiều có nghĩa là máy chủ được chia sẻ sẽ cần phải được chạy bằng điện, vì ngay cả các hệ thống có root thường không thể khắc phục được sự cố. Thông thường, họ thậm chí không thể nhận được một lời nhắc.

Tôi đã nghe một vài thủ thuật (đáng chú ý là gửi tín hiệu STOP thay vì tín hiệu KILL, vì các luồng sau sẽ cho phép các luồng còn lại thay thế ngay lập tức các chuỗi bị giết), nhưng tôi chưa bao giờ thấy một hướng dẫn toàn diện có tên Vì vậy, Bạn có chính mình một quả bom ngã ba?

Hãy làm một cái.

Câu trả lời:


10

Ngăn chặn bom ngã ba làm cạn kiệt giới hạn quy trình với giới hạn quy trình hợp lý cho mỗi người dùng bằng cách sử dụng ulimit .

Bằng cách đó, một người dùng sẽ sử dụng hết hạn ngạch quy trình của họ trước khi đạt đến giới hạn hệ thống.


6

Điều đầu tiên cần thử là đưa người dùng đã đăng nhập để đăng xuất. Có thể lớp vỏ của chúng có thể là quá trình cha mẹ của quá trình thực hiện tất cả các thao tác giả và điều đó có thể kết thúc vấn đề.

Nếu điều đó không hiệu quả, bạn có thể thử chạy kill -STOP -2bằng root để đóng băng tất cả các quy trình đang chạy như bất kỳ người dùng nào khác ngoài root. Nếu nó hoạt động, sau đó bạn có thể sử dụng kill -CONT <pid>để giải phóng một số quy trình đã biết không liên quan đến bom ngã ba và tiêu diệt chúng để loại bỏ toàn bộ vấn đề của bảng quy trình và cung cấp cho bạn một số phòng thở để theo dõi và tiêu diệt nguồn gốc của vấn đề. Sendmail sẽ là một ví dụ điển hình về quy trình hệ thống để tiêu diệt vì nó rất dễ xác định bằng cách sử dụng tệp .pid để xác định pid. Ví dụ , kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


Hệ điều hành nào bạn thấy tùy chọn "-2" cho kill? Tôi không thấy nó trong trang man trên Linux.
raldi

1
Điều này sẽ hoạt động trong hầu hết các hệ điều hành vì bạn đang chỉ định giá trị âm cho pid. Nếu <pid> nhỏ hơn -1, thì lệnh giết được gửi đến mọi quy trình trong nhóm quy trình - <pid>. Gửi một sig STOP cho pid -2, nó sẽ dừng tất cả các quy trình không phải là quy trình hệ thống đặc biệt hoặc quy trình sở hữu gốc.

Xem trang web kill (2) để giết một "pid tiêu cực", nhưng tôi vẫn không tin rằng nó hoạt động. Tại sao tất cả các quá trình không khởi tạo sẽ nằm trong nhóm 2? Tôi hiểu rằng bạn muốn tránh init, vì kết quả của nó dừng lại thường khá nghiêm trọng, nhưng ...
ephemient

@ephemient, 2 quá thấp để trở thành id nhóm quy trình nên có thể đó là một giá trị đặc biệt khác.
joshudson


3

Không chắc chắn làm thế nào bạn thậm chí có thể gửi tín hiệu STOP, vì sinh sản killsẽ yêu cầu xử lý có sẵn. Bên cạnh đó, theo kinh nghiệm của tôi, các hệ thống trở nên quá tải và không thể sử dụng được lâu trước khi hết quy trình.

Bạn đã xem xét đơn giản là thực thi giới hạn quy trình cho mỗi người dùng ulimitchưa? Điều đó sẽ ngăn người dùng của bạn phóng bom ngã ba (vô tình hay không).


3
giết là một vỏ được tích hợp, ít nhất là trong bash.
raldi

1
Tôi nghĩ đó là một thành phần quan trọng - xác định các nội trang cho vỏ bạn chọn.

2
Nếu nó không phải là một phần mềm tích hợp, bạn có thể chạy "exec kill PID", cái này không rẽ nhánh. Nhưng đó là rủi ro vì, nếu nó không hoạt động, bạn có thể không có được vỏ khác. Hãy nghĩ về nó như cách tiếp cận ong chích để quản trị hệ thống!
Stephen Darlington

2

Một số hệ thống BSD có khả năng dự trữ 5 quá trình cuối cùng cho root. Có lẽ hệ thống của bạn có khả năng đó.


3
Làm thế nào để bạn thực sự cấu hình hệ thống để làm điều này?
Nik Reiman
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.