Nó có ảnh hưởng gì đến máy chủ khi bạn giết tất cả các tiến trình root?


9

Có những nhà phát triển khác đã đăng nhập bằng root mà tôi muốn đuổi ra.

Vì vậy, tôi đã ban hành

pkill -KILL -u root

Sau đó, tôi nhận ra rằng tôi có thể đã giết tất cả các loại quy trình gốc.

Tôi đã làm hỏng hệ thống của tôi? Tôi không thể truy cập nó thông qua SSH ngay bây giờ.

CẬP NHẬT: Máy chủ web vẫn đang chạy. Nhưng tôi không thể kết nối bằng SSH ngay bây giờ. Tôi không biết tôi đã làm gì.


1
Bạn gần như chắc chắn sẽ cần phải khởi động lại nó. Nếu bạn có thể, hãy gửi cho nó tín hiệu tắt ACPI thay vì chỉ rút phích cắm.
Skyhawk

1
Iain, IME không hoàn toàn đúng. Họ phải bắt đầu với quyền root, để liên kết với các cổng đặc quyền, nhưng sau đó tạo ra một loạt các quy trình thuộc sở hữu của bất kỳ người dùng không riêng tư nào được cấu hình, để phân tách đặc quyền. Tuy nhiên, trong trường hợp apache, vẫn thường có một quy trình thuộc sở hữu gốc duy nhất ngồi ở đầu của tất cả. Nhưng tôi đồng ý với bạn rằng tất cả các quy trình thực hiện phục vụ web thực tế không thuộc sở hữu gốc.
MadHatter

5
Làm sai lầm là cách tốt nhất để học . Xin đừng downvote đơn giản vì ai đó đã phạm sai lầm. Câu hỏi này gây tranh cãi nhưng không nên đóng lại. Thay vào đó tôi thách bạn đọc sâu hơn vào suy nghĩ đằng sau câu hỏi và giải thích: Điều gì xảy ra khi tôi giết tất cả các quá trình root? Tại sao vật chủ vẫn còn sống? Tại sao SSHD không thể phục vụ các yêu cầu nhưng máy chủ web có thể? Làm thế nào có thể máy chủ web vẫn còn sống? Chúng tôi không thấy có câu trả lời chính tắc nào cho những câu hỏi này. Các câu trả lời có thể cung cấp giải thích có giá trị về cách Unix hoạt động.
Stefan Lasiewski

2
Cảm ơn Stefan, vì đã sử dụng đầu và trái tim của bạn và không bắt buộc nhấp vào nút downvote như nhiều người khác làm. Nếu không ai từng đăng câu hỏi về sai lầm của họ trên các trang web stackexchange, vì sợ bị hạ cấp, thì KHÔNG ai sẽ học hỏi từ họ. Tôi đang giúp mọi người với câu hỏi của tôi, và không nên bị trừng phạt vì nó.
Butussy Butkus

1
Tôi đã bỏ phiếu cho câu hỏi vì nó tốt cho một tiếng cười, không có ý xúc phạm. Nó giống như xem một video của ai đó rơi vào một lỗ trong khi nhắn tin.
UncaAlby

Câu trả lời:


15

Một câu trả lời nhanh là bạn đã giết sshd (và chúa biết những gì khác) và sẽ không thể đăng nhập lại vào hệ thống bằng SSH. Trừ khi bạn có một số phương pháp khác để có quyền truy cập vào hệ thống (như bảng điều khiển từ xa, IPMI, v.v.), bạn sẽ cần khởi động lại hệ thống sẽ khôi phục dịch vụ SSH và các dịch vụ khác.

Hy vọng rằng bạn có quyền truy cập vật lý vào hộp, trong trường hợp đó bạn có thể chỉ cần nhấn nút nguồn. Nhận ra rằng bạn đã giết nhiều quá trình và chuẩn bị cho một số tham nhũng. Linux được thiết kế để phục hồi sau sự cố hệ thống và về cơ bản bạn đã kích hoạt sự cố 'thủ công'. Hầu hết mọi thứ sẽ phục hồi tốt sau khi khởi động lại. Bạn có thể có tất cả các loại thông báo lỗi thú vị trong logfiles.


Câu trả lời dài:

Đây là một thử nghiệm tư duy tuyệt vời và một câu hỏi phỏng vấn công việc tốt. "Điều gì xảy ra nếu bạn đã làm X ..." Đây là một điều thú vị để thử trên máy ảo riêng của bạn, nhưng không bao giờ nên được thực hiện trên một hộp thực. Ai cũng mắc sai lầm. Ghi nhớ và học hỏi từ sai lầm của bạn. Phạm sai lầm là cách tốt nhất để học Phạm sai lầm trong sản xuất là một bài học đau đớn đôi khi sẽ xảy ra trong sự nghiệp của bạn.

pkill -KILL -u gốc

Lệnh này sẽ gửi một 'SIGKILL' (ví dụ: kill -9KILL là bí danh của SIGKILL) cho tất cả các quy trình thuộc sở hữu của root. Đó là một điều rất xấu để làm trên một hệ thống. kill -9nên tránh ngoại trừ như là một phương sách cuối cùng.

Lệnh của bạn mạnh mẽ giết chết tất cả các quy trình thuộc sở hữu gốc, các quy trình đã bị giết ngay lập tức và không có cơ hội để làm sạch. Để hiểu được những gì bạn đã giết, hãy đăng nhập vào một hộp Linux lành mạnh và liệt kê các quy trình được sở hữu bởi root, sử dụng một lệnh như một trong số này. Bạn thường không cần phải root để chạy các lệnh này:

$ pgrep -u root -l
$ ps aux | grep root

Bạn có thể đã giết init (PID # 1) để sinh ra các tiến trình mới. Hệ thống của bạn có thể không thể tạo ra các quy trình mới. Vì vậy, nó có thể tiếp tục hoạt động ngay bây giờ nhưng bị bệnh và cần được sửa chữa càng sớm càng tốt. Thời gian trôi qua, hệ thống sẽ ngày càng ốm yếu. Bạn càng đợi lâu nó sẽ càng tồi tệ hơn.

CẬP NHẬT: Máy chủ web vẫn đang chạy. Nhưng tôi không thể kết nối bằng SSH ngay bây giờ. Tôi không biết tôi đã làm gì.

Tôi đoán rằng bạn đang sử dụng Apache. Dường như các tiến trình con của máy chủ web vẫn đang chạy vì chúng không thuộc sở hữu của người dùng 'root'. Tuy nhiên, quy trình máy chủ web mẹ thường được sở hữu bởi root và bạn đã giết nó. Do đó, các quá trình con mới sẽ không sinh sản. Điều này sẽ ổn trong một thời gian, bởi vì bạn có thể có đủ các quy trình con để phục vụ các yêu cầu và thông thường các quy trình con đó sẽ tồn tại cho đến khi chúng bị giết hoặc chúng bị sập. Một lần nữa, cách khắc phục nhanh nhất là khởi động lại máy.


Tôi không có quyền truy cập vật lý nhưng tôi sẽ tìm ra một cái gì đó. Tôi đã rất ngạc nhiên khi thấy rằng Apache vẫn đang hoạt động. Vì vậy, máy đang làm tốt mà không cần root. PS nếu bạn đánh giá thấp câu hỏi, tôi đã cải thiện tiêu đề.
Butussy Butkus

1
@BriptButkus Tôi không đánh giá thấp câu hỏi. Tôi bắt đầu trả lời câu hỏi, và sau đó khá quan tâm đến lý do tại sao mọi thứ hoạt động theo cách họ làm.
Stefan Lasiewski

1
Stefan, cảm ơn câu trả lời của bạn. Đó là một câu trả lời tôi nêu lên từ đầu, vì nó có ý nghĩa. Tôi đã khởi động lại hệ thống trong vòng khoảng 10 phút và mọi thứ dường như đang hoạt động tuyệt vời kể từ đó.
Butussy Butkus

4

Rất có thể bạn sẽ phải khởi động lại hệ thống của mình vì bạn đã giết khá nhiều dịch vụ quan trọng trên nó. Làm thế nào bạn làm điều đó phụ thuộc vào những công cụ bạn có hoặc phương tiện vận chuyển bạn có để đến trung tâm dữ liệu.


Có vẻ như tôi đã giết tất cả các quá trình quan trọng, thực sự. Nếu không, tại sao máy chủ web vẫn đang phục vụ các trang web hoàn hảo?
Butussy Butkus

@BriptButkus: Máy chủ web của bạn sẽ không chạy dưới quyền root.
dùng9517

@lain Nếu ngay cả một dịch vụ "quan trọng" đã bị giết, thì tôi nghĩ điều đó sẽ khiến toàn bộ máy chủ ngừng hoạt động. Có vẻ như lệnh thực sự không giết được một dịch vụ quan trọng nào. Nó đã giết một dịch vụ tiện lợi, mặc dù: sshd.
Butussy Butkus

2
Chỉ vì một dịch vụ quan trọng bị giết, không có nghĩa là máy sẽ ngừng hoạt động ngay lập tức. Ví dụ, tôi sẽ xem xét trình điều khiển quạt của mình rất quan trọng - khi việc sử dụng cpu tăng lên, tôi muốn quạt quay nhiều hơn. Tôi có thể giết dịch vụ và sử dụng cpu thấp trong nhiều ngày, sau đó đột nhiên 1000 người truy cập trang web của tôi và cpu của tôi bắt lửa. Và còn nhiều cách gây sát thương ít đáng chú ý hơn nữa
unhammer

3

Hệ thống đang chạy vì kernel đang chạy. Bạn không thể truy cập sshd vì bạn đã giết daemon. Có lẽ init cũng đã bị chấm dứt, có nghĩa là bạn không thể tạo các quy trình mới. Vì vậy, các kết nối apache mới có thể không được thiết lập (áp dụng tham số cấu hình;)).

Bạn không thể gửi tín hiệu đến các luồng nhân, đó là lý do tại sao hệ thống đang chạy nhưng các dịch vụ thuộc sở hữu gốc đã bị chấm dứt và để phục hồi bình thường, bạn nên khởi động lại nó.


Cảm ơn các chi tiết thú vị. Tôi đã đưa cho bạn một upvote, nhưng tôi đang cho Stefan dấu tích.
Butussy Butkus
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.