Câu hỏi Phải làm gì khi Ctrl + C không thể giết một quá trình?


Ctrl + C không phải lúc nào cũng làm việc để giết tiến trình hiện tại (ví dụ, nếu quá trình đó bận trong các hoạt động mạng nhất định). Trong trường hợp đó, bạn chỉ thấy con trỏ "^ C" và không thể làm được gì nhiều.

Cách dễ nhất để buộc quá trình đó chết ngay bây giờ mà không làm mất thiết bị đầu cuối của tôi là gì?

Tóm tắt các câu trả lời: Thông thường, bạn có thể Ctrl + Z để đưa quá trình ngủ, và sau đó làm kill -9 _process-pid_, nơi bạn tìm thấy pid của quá trình với ps và các công cụ khác. Trên Bash (và có thể là các loại vỏ khác), bạn có thể làm kill -9 %1 (hoặc '% N' nói chung) dễ hơn. Nếu Ctrl + Z không hoạt động, bạn sẽ phải mở một thiết bị đầu cuối khác và giết chết từ đó.


139
2018-02-09 08:49


gốc


screen sẽ là một giải pháp khả thi, Cho phép bạn tạo một cửa sổ mới và kill quá trình từ đó. - Bobby
giả sử bạn đã ở trong màn hình :) - Dustin Boswell


Các câu trả lời:


Để hiểu được vấn đề tại sao Ctrl + C không hoạt động, nó rất hữu ích để hiểu những gì sẽ xảy ra khi bạn nhấn nó:

Hầu hết các shell ràng buộc Ctrl + C để "gửi một SIGINT tín hiệu cho chương trình hiện đang chạy ở nền trước ". Bạn có thể đọc về các tín hiệu khác nhau qua tín hiệu người đàn ông:

 SIGINT        2       Term    Interrupt from keyboard

Các chương trình có thể bỏ qua tín hiệu đó vì chúng có thể bỏ qua SIGTSTP cũng:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Đó là những gì hầu hết các vỏ làm khi bạn nhấn Ctrl + Z, đó là lý do tại sao nó không được đảm bảo để hoạt động.)

Có một số tín hiệu không thể bỏ qua bởi quá trình: SIGKILL, SIGSTOP và một số người khác. Bạn có thể gửi các tín hiệu này qua giết chết chỉ huy. Vì vậy, để giết quá trình treo / thây ma của bạn, chỉ cần tìm xử lý ID (PID). Ví dụ: sử dụng pgrep hoặc là ps và sau đó kill nó:

 % kill -9 PID

101
2018-02-09 09:13



Chỉ là một nhận xét. Cẩn thận rằng "zombie" về mặt kỹ thuật là một trạng thái quá trình, và nó không giống như những gì bạn có ý nghĩa ở đây bởi "zombieying". (Một quá trình chấm dứt mà không được chờ đợi () - ed bởi cha mẹ của nó là trong zombie (Z) tiểu bang. Trong trường hợp này, nó không thể xử lý tín hiệu nữa.) - Stéphane Gimenez
than ôi, đôi khi ctrl + c, ctrl + z và ctrl + \ tất cả đều không làm gì cả, và quá trình đang chạy hoàn tác sudo (được phép không có mật khẩu), do đó bạn không thể gửi tín hiệu đến quy trình. - Michael


Nếu Ctrl+C (SIGINT) không hoạt động, hãy thử Ctrl+\ (SIGQUIT). Vậy hãy thử đi Ctrl+Z (SIGTSTP). Nếu điều đó đưa bạn trở lại dấu nhắc trình bao, hãy làm kill trên ID tiến trình. (Điều này mặc định là tín hiệu SIGTERM, mà bạn có thể chỉ định kill -TERM. Trong một số vỏ, bạn có thể sử dụng %1 để tham khảo PID.) Nếu điều đó không hiệu quả, hãy đi đến một thiết bị đầu cuối hoặc phiên SSH khác và thực hiện kill hoặc là kill -TERM trên ID tiến trình. Chỉ là phương sách cuối cùng bạn nên làm kill -KILL, a.k.a. kill -9, vì nó không cung cấp cho quá trình bất kỳ cơ hội nào để xóa sạch, đồng bộ hóa các tệp đang mở của nó, xóa các tệp tạm thời của nó, đóng các kết nối mạng, v.v.


90
2018-02-09 09:36





Nhấn Ctrl-Z để đình chỉ chương trình và đặt nó trong nền:

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Khôi phục lại nền trước bằng cách sử dụng fg)

Sau đó bạn có thể kill hoặc là kill -9 nó, với ID tiến trình của nó (bạn nhận được nó từ ps a).


26
2018-02-09 08:53



Với bash bạn có thể kill $!, như $! là một biến đặc biệt chứa pid của chương trình nền cuối cùng. - Lloeki
@Lloeki Không làm việc cho tôi (ít nhất là không đáng tin cậy). Tôi phải bg một lần trước khi biến được gán giá trị. - Daniel Beck♦
@Daniel, đúng. Như tôi đã nói cuối cùng có nền quá trình, do đó cần bg ngay sau Ctrl + Z nó chỉ bị treo. - Lloeki
Lưu ý: đây không chỉ là mẹo, sử dụng ps đầu ra (hoặc killall) khá rủi ro nếu bạn có nhiều quy trình có cùng tên đang chạy. ps -e -o pid,command sẽ cung cấp pid + đầy đủ args, không chỉ tên chương trình, nhưng một lần nữa có thể không đủ để phân biệt đối xử. Ngược lại $! là một hit chắc chắn. - Lloeki
@Lloeki Tôi không đồng ý. Ví dụ dòng đầu ra từ ps a trên hệ thống của tôi: 27721 s000 T 0:00.09 top Có bao nhiêu lơ lửng (T, Tôi nghĩ) các trường hợp của cùng một lệnh (top) bạn có chạy trong cùng một tty không (s000)? - Daniel Beck♦


Xem này liên kết cũng.

Ctrl+Z: tạm dừng một quá trình.

Ctrl+C: lịch sự yêu cầu quá trình đóng cửa ngay bây giờ.

Ctrl+\: không thương tiếc giết quá trình hiện đang ở tiền cảnh


21
2018-06-19 03:03





Thông thường, bạn vẫn có thể dừng quá trình (Ctrl + Z) và sau đó sử dụng kill -9. Dành cho kill -9, bạn cần tiến trình PID Đầu tiên. Đối với công việc trong nền, kill -9 %1 là cách dễ nhất để làm điều đó - nếu bạn không chắc chắn số lượng công việc nền mà bạn muốn giết là gì, hãy chạy jobs.

Ngoài ra, bạn có thể tìm ID tiến trình bằng

ps

Sau đó, bạn có thể chạy

kill -9 <Appropriate PID from ps output>

10
2018-02-09 08:53





1) Nếu bạn đang ở trên giao diện điều khiển và ở chế độ đa người dùng, bạn có thể nhấn CTRL-ALT-Fn và đăng nhập trên màn hình khác, sử dụng ps -ef | grep <myprocessname> hoặc là pidof <myprocessname> và sau đó giết -9 quá trình bằng số ID.

2) Nếu bạn được kết nối từ xa, hãy thực hiện tương tự thông qua một phiên đầu cuối khác.

Bạn cũng có thể làm cho cuộc sống dễ dàng hơn một chút bằng cách cài đặt htop, đó là một phiên bản linh hoạt hơn của đầu cho phép bạn chọn lọc giết các tiến trình đang chạy. Hầu hết các distro có htop trong repo.

3) nếu bạn chỉ bị mắc kẹt trong một phiên ssh treo (ví dụ như một hệ thống khác), hãy thử nhấn dấu ngã (~), đó là phím thoát, sau đó nhấn CTRL-Z để quay lại phiên máy chủ, sau đó bạn có thể giết chết quá trình ssh bị mắc kẹt hoặc chờ cho nó hết thời gian chờ, mà hầu hết ngưỡng cửa làm sau một khoảng thời gian không hoạt động.


4
2018-02-09 09:01





Một giải pháp đơn giản hơn cho Bash (và các shell khác) là:

Ctrl-z      followed by     kill -9 %1

trong đó '% 1' đề cập đến số công việc bị giết. Nó có thể là '% 2' (hoặc cái gì khác) nếu bạn đã có công việc khác ngủ. Bạn có thể xem số công việc nào khi nhấn Ctrl-z:

[1]+  Stopped                 <process name>

Lưu ý rằng 'kill' là phiên bản diệt của shell, không phải / bin / kill.


3
2018-04-18 10:41





Nếu bạn đang sử dụng tmux hoặc màn hình, và không ai trong số các công trình trên, bạn vẫn có thể giết cửa sổ bằng cách <prefix> x, sau đó quá trình cũng bị giết.


0
2017-10-26 13:16





Có lẽ một cái bẫy được thiết lập với SIGINT (2) trong / etc / profile của bạn. Nếu có, hãy xóa nó. Đăng xuất và đăng nhập lại và bạn sẽ tốt.


0