Ctrl + c sẽ không giết tiến trình


8

Tôi đã tìm kiếm câu trả lời và cho đến nay không tìm thấy gì để trả lời câu hỏi của tôi. Tôi hiện đang đăng nhập vào máy chủ Ubuntu của mình và sau khi chạy một quy trình, tôi không thể chạy bất kỳ gián đoạn nào trên đó. Đây là stty của tôi -a:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

Tôi không có gì trong .bashrc của tôi thay đổi các ngắt.

Điều này là giống nhau cho tất cả người dùng bao gồm cả root. Tôi cũng đã thử đăng nhập từ các vị trí khác nhau bằng các thiết bị đầu cuối khác nhau và mỗi khi kết quả này xuất hiện. Tôi đã sử dụng cả ssh và ssh -X để đăng nhập.

Chỉnh sửa: Tại địa phương tất cả các ngắt của tôi hoạt động tốt.

Cập nhật: Tôi vẫn đang tìm kiếm một câu trả lời. Bạn tôi có cùng một vấn đề. Vấn đề có vẻ rất nhiều là khi đăng nhập (từ PC, Mac, Linux), bàn phím không nhận được các phím này (mặc dù được ánh xạ chính xác).


Đầu ra Ctrl+Vvà đánh là Ctrl+Cgì? Bạn đã thử giết quá trình với kill -s 2 <pid_of_process>? Điều này nên bằng với việc gửi tín hiệu SIGINT đến quá trình. Kiểm tra cài đặt phím giả lập thiết bị đầu cuối của bạn.

Đầu ra là chính xác. Nếu tôi thực hiện Ctrl + V sau đây và Ctrl + CI nhận ^ C. Tôi nhận được tương tự nếu tôi làm Ctrl + V và sau đó Ctrl + ZI nhận ^ Z. Tôi có thể giết các tiến trình với kill nếu tôi làm điều này từ một thiết bị đầu cuối khác. Cũng vì vậy lưu ý cục bộ và trong các thiết bị đầu cuối khác, các lệnh này hoạt động tốt
user700786

3
Bạn đã thử nhấn Ctrl+Ctrong khi chạy một quá trình khác (ví dụ cat)? Có lẽ đó là quá trình mà bỏ qua Ctrl+C. Hoặc bạn có nghĩa là cục bộ trên máy chủ Ubuntu, quá trình cụ thể đó đáp ứng Ctrl+C, trong trường hợp nào, bạn đã thử thiết bị đầu cuối nào? Một screenphiên thì sao?
Gilles 'SO- ngừng trở nên xấu xa'

Nếu tôi chạy bất cứ thứ gì trong thiết bị đầu cuối trên máy của mình thì nó sẽ nhận được các ngắt không có vấn đề gì. Ngay sau khi tôi vào máy chủ của mình, nó sẽ không nhận được các ngắt. Không có quá trình nào tôi đã thử nhận bất kỳ ngắt nào
user700786

Nếu lệnh bị giết bằng kill -s 2(lưu ý -s 2, đó là SIGINT(tín hiệu thường được gửi khi bạn nhấn Ctrl + C, mặc định killSIGTERM)), thì lệnh không bỏ qua ngắt. Một cái gì đó khác đang nhặt nó lên. Khi bạn chạy cái này cục bộ và nó hoạt động, bạn có nói nó hoạt động bằng cách sử dụng cùng một thiết bị đầu cuối trong máy khách để chạy một cái gì đó cục bộ hoặc chạy một trình giả lập thiết bị đầu cuối cục bộ trong máy chủ không? Tôi tự hỏi nếu bạn đang sử dụng một số trình giả lập đang cố gắng bắt chước Ctrl + C từ thế giới Windows ...
njsg

Câu trả lời:


5

ctrl+ ckhông bao giờ giết chương trình,

Đó không phải là những gì nó làm.

Có một tập hợp các tín hiệu mà tiêu chuẩn POSIX xác định, chúng được sử dụng để điều khiển một chương trình đang chạy.

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ cgửi tín hiệu 2, "Ngắt từ bàn phím" đến chương trình bạn chạy từ thiết bị đầu cuối.

Nó hoàn toàn tùy thuộc vào chương trình để xử lý tín hiệu đó, nó có thể làm bất cứ điều gì nó muốn về nó. Nhiều người phiên dịch ngôn ngữ kịch bản có thể xử lý việc này theo cách mặc định bằng cách giết tập lệnh được gọi và thoát ra một cách duyên dáng.

Nếu bạn muốn một chương trình thoát, đặc biệt là từ ngữ cảnh tự động, khuyến nghị số 15, killchương trình có thể được sử dụng để gửi tín hiệu đến một quá trình theo id (pid).

kill -15 <pid>

Theo như tôi biết, chương trình vẫn nhận được tín hiệu này và nên chấm dứt ASAP càng sạch càng tốt.

Nếu chương trình bỏ qua tín hiệu 15, và chương trình vẫn tồn tại (và bạn không thể gửi tín hiệu do lỗi cấp phép)

kill -9 <pid>

Tín hiệu 9, theo như tôi biết, được giải thích bởi kernel (trình quản lý tác vụ và giao diện phần cứng), kernel đột ngột dừng xử lý chương trình và phân bổ / giải phóng tất cả các tài nguyên của nó.


3

Đây là một số mẹo khó:

Control-Z

nó sẽ đình chỉ quy trình của bạn và nó sẽ trả lại cho bạn ID công việc của quy trình đó

Sau đó:

kill -9 %1

(thay thế 1 bằng ID công việc của bạn).

Lưu ý: Tỷ lệ phần trăm là bắt buộc!, Nếu không, bạn sẽ giết tiến trình init của mình, điều đó có nghĩa là bạn sẽ giết kernel và toàn bộ hệ thống sẽ bị sập (vì vậy đừng đặt khoảng trống ở giữa :)


0

Ctrl + c sẽ không giết quá trình. nó sẽ chỉ dừng quá trình chạy hiện tại ở giữa. Để giết tiến trình, chúng ta cần sử dụng lệnh "KILL"


7
Trong thực tế killgửi một tín hiệu cho một quá trình. Không giết nó. Tín hiệu mặc định được gửi với killTERM, tín hiệu được gửi cùng ctrl+cSIGINT.
fmanco

0

Tôi chạy vào bài viết diễn đàn cũ về vấn đề đặc biệt này. Dường như trình tự ngắt mặc định có thể được ghi đè trong một tệp cấu hình riêng ở đâu đó.

Nếu bạn chỉ muốn tiêu diệt quá trình này ở bên ngoài, bạn có thể sử dụng kill, hãy cẩn thận rằng bạn nên leo thang tiêu diệt như được nêu trong bài viết này về các quy trình tiêu diệt , thay vì chỉ chuyển sang tiêu diệt cực đoan -9.

Wikipedia là một nguồn tài nguyên tuyệt vời cho chương trình tiêu diệt . Ngoài ra đây là danh sách các tín hiệu Unix và những gì họ làm.

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.