Cấm giết <PID> không thực sự giết quá trình, tại sao?


118

Tôi đang cố gắng cải thiện các kỹ năng dòng lệnh của mình và tôi đã gặp phải một vấn đề trong đó tôi không thể giết chết một quy trình. Tôi gõ kill 2200trong đó 2200 là PID của tôi và quá trình không bị giết. Sau vài phút chờ đợi vẫn còn trong topps aux. Tôi thậm chí đã thử gõ nó với sudo - không có kết quả.

Bất cứ ý tưởng tại sao nó sẽ như vậy?


BIÊN TẬP

Tôi đã tìm thấy một phụ thuộc kỳ lạ, nơi fgcập nhật danh sách các quy trình:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

Quá trình đó là gì? Bạn đã kiểm tra nếu quá trình có thể không còn tồn tại ? Trong trường hợp đó, bạn cần phải giết tiến trình cha.
htorque

Quá trình này là top(như được liệt kê trong bản chỉnh sửa). Tôi chỉ muốn thử đưa chương trình hoạt động vào nền và sau đó đưa nó trở lại.
Patryk

2
Nếu bạn tạm dừng một quy trình với CTRL-z, nó sẽ chặn hầu hết các tín hiệu miễn là nó bị treo (tức là cho đến khi bạn thực hiện fghoặc bgxử lý)
nos

Câu trả lời:


179

Quá trình có thể bỏ qua một số tín hiệu. Nếu bạn gửi SIGKILL, nó sẽ không thể bỏ qua nó (và cũng không bắt nó phải dọn dẹp). Thử:

kill -9 {PID}

Tìm hiểu thêm bằng cách đọc trang hướng dẫn:

man kill

22
cũng lưu ý rằng trong một số trường hợp rất cụ thể , một quy trình có thể ở trạng thái zombie / không còn tồn tại mà ngay cả SIGKILL cũng không thể giết được quy trình. Trong trường hợp đó, bạn sẽ phải tìm tiến trình cha và hủy tiến trình cha.
Lie Ryan

15
Nếu quá trình đó bước ra khỏi dòng thì đó là KILL DASH NINE !
scottl

4
Và đôi khi không có quá trình cha mẹ, trong trường hợp đó bạn chỉ bị lừa. Cách duy nhất để loại bỏ quá trình như vậy là khởi động lại máy.
dùng606723

2
Tên của lệnh kill tiếp tục gây hiểu lầm cho nhiều người, nhiều người dùng (bao gồm cả tôi lúc đầu). Người ta cho rằng khi bạn nói "kill X", điều này có nghĩa là thực sự giết X và không làm gì khác. Tôi hiểu điều này sẽ không thay đổi một điều nhưng tôi ước họ đã chọn được một cái tên phức tạp hơn ...
rbaleksandar

1
Làm gì ngay cả sau khi kill -9không làm việc và quá trình vẫn còn lảng vảng?
Douglas Gaskell

42

Nếu killđược gọi mà không có bất kỳ tham số nào, nó sẽ gửi tín hiệu số 15 ( SIGTERM). Tín hiệu này có thể được bỏ qua bởi quá trình. Tín hiệu này thông báo cho quá trình dọn dẹp đồ đạc của anh ta và sau đó tự kết thúc một cách chính xác. Đó là cách tốt đẹp.

Bạn cũng có thể "gửi" tín hiệu số 9 ( SIGKILL) mà quy trình không thể bỏ qua. Quá trình thậm chí sẽ không nhận ra nó, bởi vì kernel kết thúc quá trình, chứ không phải chính quá trình. Đó là cách ác.

Một người nói kill -9 <pid>luôn luôn làm việc. Đó là một sự hoài nghi . Có những tình huống thậm chí kill -9không giết chết quá trình. Ví dụ khi một quá trình có trạng thái D(giấc ngủ không bị gián đoạn). Một quá trình đi vào trạng thái này mỗi khi nó chờ I / O (thông thường không lâu lắm). Vì vậy, nếu một quá trình chờ I / O (ví dụ trên ổ cứng bị lỗi) và nó không được lập trình đúng (có thời gian chờ), thì bạn chỉ đơn giản là không thể giết tiến trình . Bất kể bạn làm gì. Bạn chỉ có thể cố gắng làm cho tệp có thể truy cập được mà quá trình tiếp tục.


2
Điều này rất hữu ích, tôi đã trải nghiệm điều này nhiều lần vì treo quyền truy cập I / O trên các đĩa mạng và tôi đã tự hỏi tại sao tôi không thể giết các quá trình bị đóng băng. Có nhiều tài liệu về vấn đề cụ thể này và làm thế nào để khắc phục nó?
Sheljohn

7

Mặc dù tên kill không thực sự giết tiến trình, nó sẽ gửi tín hiệu đến nó. Từ trang người đàn ông:

kill - send a signal to a process

Các tín hiệu mặc định gửi qua đường kill [pid]SIGTERM mà thường nhưng không nhất thiết phải yêu cầu quá trình chấm dứt. Bạn hoàn toàn có thể viết chương trình phát một giai điệu vui vẻ khi bạn gửi tín hiệu SIGTERM cho nó, nhưng không được khuyến nghị.

Một tín hiệu phổ biến khác là SIGHUP thường được sử dụng để yêu cầu chương trình đọc lại các tệp cấu hình của nó.

Nếu bạn thực sự muốn giết một chương trình, bạn cần sử dụng tín hiệu SIGKILL bằng cách thực hiện kill -9 [pid].


2

Có vẻ như bạn có thể đang tạm dừng một quá trình (có thể bằng cách nhấn Ctrl-Z trong thiết bị đầu cuối). Ở trạng thái này, quy trình của bạn sẽ không phản hồi với SIGTERM vì nó bị đóng băng. Chạy 'fg' làm tan quá trình, vì vậy nó có thể nhận tín hiệu và tự chấm dứt. Điều đó có thể giải thích tại sao 'fg' xuất hiện để cập nhật danh sách quy trình.


1
Vậy làm thế nào để tìm thiết bị đầu cuối đính kèm?
ruX

0

Từ trong C ++, tôi đã thực hiện:

kill(4024, SIGKILL);

Và trên thiết bị đầu cuối linux (Ubuntu),

$ ps -ax | grep my_su

Đầu ra là:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Dường như, nó (4024) vẫn còn sống sót. Tuy nhiên, ngay sau khi tôi chấm dứt quá trình cha mẹ được gọi là tuyên bố "giết" ở trên, 4024 đã không xuất hiện nữa. Bây giờ tôi đánh giá quá trình "không còn tồn tại" không gì khác hơn là một dòng được hiển thị và quyết định bỏ qua nó. Tôi hy vọng kinh nghiệm của tôi có thể giúp ai đó ngoài kia. Chúc mừng!


0

Bạn cũng có thể sử dụng kill -lđể hiển thị các tín hiệu được hỗ trợ theo kiến ​​trúc của mình và tìm hiểu thêm về tín hiệu bạn có thể muốn sử dụng để gửi tín hiệu chính xác.

Lưu ý: như những người khác có thể đã đề cập, việc sử dụng kill -9 {PID}không được khuyến khích trừ khi đó là quá trình zombie. khi một quy trình nhận được SIGKILL sẽ tắt ngay lập tức mà không cần làm sạch hoặc bất kỳ quy trình thích hợp nào khác.


0

Đây là những gì tôi đã sử dụng để đặt localhost chạy trên cổng 80 (Theo góc cạnh) Nhận thông tin ứng dụng đang chạy trên cổng 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

nơi 3348là pid của tiến trình đang chạy

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.