it-swarm-vi.com

Khi nào tôi không nên giết -9 một quá trình?

Tôi luôn rất do dự khi chạy kill -9, nhưng tôi thấy các quản trị viên khác làm việc đó gần như thường xuyên.

Tôi nghĩ có lẽ có một khu vực giữa hợp lý, vì vậy:

  1. Khi nào và tại sao nên kill -9 được dùng? Khi nào và tại sao không?
  2. Những gì nên được thử trước khi làm điều đó?
  3. Loại gỡ lỗi nào của quá trình "treo" có thể gây ra vấn đề hơn nữa?
405
Mikel

Nói chung, bạn nên sử dụng kill (viết tắt của kill -s TERM hoặc trên hầu hết các hệ thống kill -15) trước kill -9 (kill -s KILL) để cung cấp cho quá trình mục tiêu một cơ hội để làm sạch sau đó. (Các quy trình không thể bắt hoặc bỏ qua SIGKILL, nhưng chúng có thể và thường bắt được SIGTERM.) Nếu bạn không cho quá trình hoàn thành những gì nó đang làm và dọn sạch, thì nó có thể để lại các tệp bị hỏng (hoặc trạng thái khác) xung quanh mà nó sẽ không thể hiểu được khi được khởi động lại.

strace/truss, ltracegdb nói chung là những ý tưởng tốt để xem xét lý do tại sao một quy trình bị kẹt lại bị kẹt. (truss -u trên Solaris đặc biệt hữu ích; Tôi thấy ltrace quá thường xuyên trình bày các đối số cho các cuộc gọi thư viện ở định dạng không sử dụng được.) Solaris cũng có ích /proc- công cụ dựa trên, một số trong số đó đã được chuyển sang Linux. (pstack thường hữu ích).

366
geekosaur

Randal Schwartz thường đăng bài "Sử dụng vô dụng (x)" trong danh sách. Một bài như vậy là về kill -9. Nó bao gồm các lý do và một công thức để làm theo. Đây là phiên bản được xây dựng lại (trích dẫn bên dưới).

(Trích lời gớm ghiếc)

Không không không. Đừng dùng kill -9.

Nó không cho quá trình một cơ hội để làm sạch:

1) tắt kết nối ổ cắm

2) làm sạch các tập tin tạm thời

3) thông báo cho con của nó rằng nó sẽ biến mất

4) thiết lập lại các đặc điểm đầu cuối của nó

vân vân và vân vân.

Nói chung, gửi 15, và đợi một hoặc hai giây, và nếu điều đó không hiệu quả, hãy gửi 2, và nếu điều đó không hiệu quả, hãy gửi 1. Nếu không, hãy BỎ L BIN B BINNG CÁCH vì chương trình hoạt động kém!

Đừng dùng kill -9. Đừng mang ra máy gặt đập liên hợp chỉ để dọn dẹp chậu hoa.

Chỉ cần sử dụng Usenet vô dụng khác,

(.Chữ ký)

230
Shawn J. Goff

Nó sẽ luôn luôn ổn để làm kill -9, giống như nó luôn luôn ổn khi tắt máy bằng cách kéo cáp nguồn. Nó có thể chống lại xã hội và để lại một số phục hồi để làm, nhưng nó phải hoạt động, và là một công cụ quyền lực cho những người thiếu kiên nhẫn.

Tôi nói điều này như một người sẽ thử tiêu diệt (15) trước, bởi vì nó cho chương trình một cơ hội để dọn dẹp - có lẽ chỉ cần viết vào một bản ghi "thoát trên sig 15". Nhưng tôi sẽ không chấp nhận bất kỳ khiếu nại nào về hành vi xấu đối với một vụ giết -9.

Lý do: nhiều khách hàng làm điều đó với những thứ mà các lập trình viên thích thì không. Thử nghiệm giết ngẫu nhiên -9 là một kịch bản thử nghiệm tốt và công bằng, và nếu hệ thống của bạn không xử lý nó, hệ thống của bạn sẽ bị hỏng.

77
dbrower

Tôi sử dụng kill -9 theo cách tương tự như cách tôi ném dụng cụ nhà bếp vào máy rửa chén: nếu việc thực hiện nhà bếp bị phá hỏng bởi máy rửa chén thì tôi không muốn điều đó.

Điều tương tự cũng xảy ra với hầu hết chương trình (thậm chí cả cơ sở dữ liệu): nếu tôi không thể giết chúng mà không gặp sự cố, tôi không thực sự muốn sử dụng chúng. (Và nếu bạn tình cờ sử dụng một trong những cơ sở dữ liệu không khuyến khích bạn giả vờ rằng họ đã lưu giữ dữ liệu khi họ không có: tốt, tôi đoán rằng đã đến lúc bạn bắt đầu nghĩ về những gì bạn đang làm).

Bởi vì trong thế giới thực, mọi thứ có thể đi xuống bất cứ lúc nào vì bất kỳ lý do gì.

Mọi người nên viết phần mềm có khả năng chịu sự cố. Đặc biệt trên các máy chủ. Bạn nên học cách thiết kế phần mềm giả định rằng mọi thứ sẽ bị hỏng, sụp đổ, v.v.

Điều tương tự cũng xảy ra với phần mềm máy tính để bàn. Khi tôi muốn tắt trình duyệt của mình, thường phải mất AGES để tắt. Có không có gì trình duyệt của tôi cần để làm điều đó sẽ mất nhiều hơn một vài giây. Khi tôi yêu cầu nó tắt nó nên quản lý để làm điều đó ngay lập tức. Khi nó không, tốt, sau đó chúng tôi rút kill -9 và tạo ra nó.

39
borud

Không được đề cập trong tất cả các câu trả lời khác là trường hợp kill -9 Hoàn toàn không hoạt động, khi một quá trình là <defunct> Và không thể bị giết:

Làm cách nào tôi có thể giết tiến trình <defposed> có cha mẹ là init?

Thế nào là không đúng cho một quá trình và tại sao nó không bị giết?

Vì vậy, trước khi bạn cố gắng kill -9 Một quy trình <defunct> Hãy chạy ps -ef Để xem cha mẹ của anh ta là gì và thử -15 (HẠN) hoặc -2 (INT) và cuối cùng -9 (KILL) trên cha mẹ của mình.

Lưu ý :những gì ps -ef Làm .

Chỉnh sửa và thận trọng sau này : Tiến hành thận trọng khi giết các quá trình, cha mẹ hoặc con cái của họ, vì chúng có thể để các tệp được mở hoặc bị hỏng, các kết nối chưa hoàn thành, có thể làm hỏng cơ sở dữ liệu, trừ khi bạn biết kill -9 Thực hiện cho một quy trình, chỉ sử dụng nó như là phương sách cuối cùng và nếu bạn cần chạy kill, hãy sử dụng các tín hiệu được chỉ định ở trên trước khi sử dụng -9 (KILL)

10
Eduard Florinescu

Không bao giờ không bao giờ làm kill -9 1. Ngoài ra, tránh giết trên một số quy trình nhất định như mount`. Khi tôi phải giết rất nhiều tiến trình (ví dụ như phiên X bị treo và tôi phải giết tất cả các quy trình của một người dùng nhất định), tôi đảo ngược thứ tự của các quy trình. Ví dụ:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|Ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Hãy nhớ rằng kill không dừng quá trình và giải phóng tài nguyên của nó. Tất cả những gì nó làm là gửi tín hiệu SIGKILL cho quá trình; bạn có thể kết thúc với một quá trình treo.

6
HandyGandy

Giết quá trình willy-nilly không phải là một động thái suôn sẻ: dữ liệu có thể bị mất, các ứng dụng được thiết kế kém có thể tự phá vỡ theo những cách tinh vi không thể sửa chữa mà không cần cài đặt lại .. nhưng nó hoàn toàn phụ thuộc vào việc biết cái gì và cái gì không an toàn trong tình hình đưa ra. và những gì sẽ có nguy cơ. Người dùng nên có một số ý tưởng về một quy trình là gì, hoặc nên làm gì và các ràng buộc của nó là gì (đĩa IOPS, rss/hoán đổi) và có thể ước tính một quá trình chạy dài sẽ mất bao lâu (giả sử sao chép tệp, mã hóa lại mp3, di chuyển email, sao lưu, [thời gian yêu thích của bạn ở đây].)

Hơn nữa, việc gửi SIGKILL tới pid không đảm bảo sẽ giết được nó. Nếu nó bị kẹt trong một tòa nhà cao tầng hoặc đã được khoanh vùng (Z in ps), nó có thể tiếp tục được khoanh vùng. Đây thường là trường hợp của ^ Z một quá trình chạy dài và quên mất bg trước khi thử kill -9 nó. Một fg đơn giản sẽ kết nối lại stdin/stdout và có thể bỏ chặn quá trình, thường sau đó là quá trình kết thúc. Nếu nó bị kẹt ở nơi khác hoặc trong một số dạng bế tắc hạt nhân khác, chỉ có thể khởi động lại có thể loại bỏ quá trình. (Các quy trình Zombie đã chết sau khi SIGKILL được xử lý bởi kernel (không có mã vùng người dùng nào nữa sẽ chạy), thường có một lý do kernel (tương tự như bị "chặn" chờ trên một tòa nhà để kết thúc) cho quá trình không chấm dứt.)

Ngoài ra, nếu bạn muốn giết một tiến trình và tất cả các con của nó, hãy tập thói quen gọi kill bằng PID bị phủ định, không chỉ là chính PID. Không có gì đảm bảo SIGHUP, SIGPIPE hoặc SIGINT hoặc các tín hiệu khác được dọn sạch sau đó và có một loạt các quy trình bị từ chối để dọn dẹp (nhớ mongrel?) Rất khó chịu.

Tiền thưởng ác: kill -9 -1 có hại hơn một chút so với kill -9 1 (Đừng làm như là root trừ khi bạn muốn xem điều gì xảy ra trên một máy ảo không quan trọng, vứt bỏ)

5
dhchdhd

Tôi đã tạo một tập lệnh giúp tự động hóa vấn đề này.

Nó dựa trên câu trả lời hoàn chỉnh của tôi 2 trong một câu hỏi rất giống nhau tại stackoverflow .

Bạn có thể đọc tất cả các giải thích ở đó. Để tóm tắt, tôi khuyên bạn chỉ nên SIGTERMSIGKILL, hoặc thậm chí SIGTERM, SIGINTSIGKILL. Tuy nhiên tôi đưa ra nhiều lựa chọn hơn trong câu trả lời đầy đủ.

Xin vui lòng, tải xuống (sao chép) nó từ github kho lưu trữ để giết chết1

3
Dr Beco

Tại sao bạn không muốn kill -9 Một quy trình bình thường

Theo man 7 signal:

Các tín hiệu SIGKILL và SIGSTOP không thể bị bắt, chặn hoặc bỏ qua.

Điều này có nghĩa là ứng dụng nhận được một trong hai tín hiệu này không thể "bắt" chúng thực hiện bất kỳ hành vi tắt máy nào.

Bạn nên làm gì trước khi chạy kill -9 Trên một quy trình

Bạn nên đảm bảo rằng trước khi gửi tín hiệu đến quy trình mà bạn:

  1. Đảm bảo rằng quy trình không bận rộn (tức là thực hiện "công việc"); gửi kill -9 cho quy trình về cơ bản sẽ dẫn đến việc mất dữ liệu này.
  2. Nếu quy trình là một cơ sở dữ liệu không đáp ứng, hãy đảm bảo rằng nó đã xóa bộ nhớ cache trước. Một số cơ sở dữ liệu hỗ trợ gửi các tín hiệu khác đến quy trình để buộc xóa bộ đệm của nó.
3
user26053