Làm thế nào để giết một con mèo chạy trốn?


128

Nhiều lần tôi vô tình chạy catlệnh trên các tệp có nội dung lên tới vài nghìn dòng.

Tôi cố gắng giết catlệnh bằng Ctrl+ Choặc Ctrl+ Z, nhưng cả hai chỉ có hiệu lực sau khi tổng đầu ra catđược hiển thị trong thiết bị đầu cuối, vì vậy tôi phải đợi cho đến khi catđược thực thi hoàn toàn.

Có một giải pháp tốt hơn mà tránh chờ đợi? Bởi vì đôi khi các tệp có kích thước lên tới 100MBs và thật khó chịu khi chờ đợi nó.

Tôi đang sử dụng tcsh.


14
Sử dụng các lệnh như nhiều hơn, ít hơn, đuôi, đầu có thể là một thay thế thú vị cho mèo. (tất nhiên đây không phải là câu trả lời ...)
tonioc

25
Đó là tiêu đề câu hỏi lớn nhất mà tôi từng đọc. Cho đến khi tôi thấy rằng liên kết của câu hỏi là dành cho UL, tôi nghĩ bạn cần giúp đỡ để giết một con mèo bỏ trốn.
Lenz

5
Có phải lấy hai lần ở câu hỏi bên cạnh từ một trang SE khác Rất nhẹ nhõm khi thấy logo "UL" bên cạnh câu hỏi . Nevermind, tiếp tục. (thông thường, đó là Arquade có tiêu đề câu hỏi ngoài ngữ cảnh rất sai)
LindaJeanne

12
Tôi sẽ thử curiositylệnh ...
Sekhemty

4
alias curiosity='sudo killall cat'
cas

Câu trả lời:


76

Nếu (các) tệp trong câu hỏi chứa thực sự nhiều dữ liệu gửi tín hiệu thực sự có thể nhận được cattrước khi kết thúc. Những gì bạn thực sự quan sát là tốc độ hữu hạn của thiết bị đầu cuối của bạn - catgửi dữ liệu đến thiết bị đầu cuối và phải mất một thời gian để thiết bị đầu cuối hiển thị tất cả.

Hãy nhớ rằng, thông thường nó phải bằng cách nào đó vẽ lại toàn bộ cửa sổ đầu ra cho mỗi dòng đầu ra (nghĩa là di chuyển nội dung của cửa sổ lên một dòng và in dòng tiếp theo ở dưới cùng). Mặc dù có các kỹ thuật và thuật toán để thực hiện việc này nhanh hơn so với việc nó được thực hiện theo cách đơn giản, nhưng vẫn cần một chút thời gian.

Do đó, nếu bạn muốn loại bỏ đầu ra càng nhanh càng tốt, hãy ẩn cửa sổ terminal , bởi vì sau đó thường không có quá trình vẽ lại thực tế diễn ra. Trong môi trường đồ họa, điều này có thể có nghĩa là thu nhỏ cửa sổ hoặc chuyển sang một máy tính để bàn ảo khác, trên bảng điều khiển ảo Linux chỉ cần chuyển sang một cửa sổ khác (( Ctrl+) Alt+ ).Fx

Cũng lưu ý rằng nếu bạn chạy nó qua một liên kết mạng chậm (ví dụ SSH qua kết nối GSM), bạn chắc chắn sẽ thấy đầu ra ít hơn nhiều trước khi catbị tín hiệu giết chết, bởi vì tốc độ của thiết bị đầu cuối sẽ không còn là nút cổ chai nữa .


6
Nếu bạn đang chờ dữ liệu đi xuống một đường ống SSH chậm, bạn có thể sử dụng chuỗi thoát OpenSSH để đóng kết nối. Trên một dòng mới, gõ ~?để xem các tùy chọn có sẵn ( ~.đóng).
RJHunter

11
Bạn cũng thử dừng đầu ra với Ctrl + S sẽ gửi tty-stop-output. Sau đó, bạn có thể gửi Ctrl + C. Để tiếp tục đầu ra, nhấn Ctrl + Q ...
Martin Tournoij

1
@Carpetsmoker Đã kiểm tra rằng, đã không dừng dòng văn bản cho tôi trên Ubuntu 14.04 + terminator + zsh.
muru

@muru Cảm ơn. Tôi đã thử kiểm tra nó, nhưng không thể tái tạo vấn đề (hệ thống của tôi quá nhanh, có vẻ như vậy, hoặc có lẽ tôi đã không cố gắng hết sức).
Martin Tournoij

4
@Carpetsmoker Tôi sợ điều khiển luồng phần mềm (là Ctrl + S) sẽ không giúp được gì nhiều trong trường hợp này (của liên kết đầu cuối nhanh) - dữ liệu đã có trong bộ đệm đầu cuối và chờ thiết bị đầu cuối xử lý. Do đó Ctrl + S sẽ yêu cầu ứng dụng ngừng gửi thêm dữ liệu, nhưng những gì đã được gửi sẽ vẫn phải được hiển thị.
peterph

4

Thiết lập thiết bị đầu cuối

Tôi cho rằng điều này có liên quan nhiều đến cách thiết lập thiết bị đầu cuối, hơn là với bất kỳ vấn đề đệm nào. Kiểm tra đầu ra của stty -a | grep intr, bạn nên có intr = ^C;trên dòng đầu ra nếu Ctrl- Cđược bật tại tty/ pty. Nếu không, bạn có thể sử dụng stty intr ^Cđể kích hoạt nó. Thêm dòng vào của bạn .tcshrchoặc .loginđể làm cho nó vĩnh viễn (hoặc xóa dòng thay đổi nó ở vị trí đầu tiên!).

Không Ctrl- C, bạn cũng có thể thử gửi SIGQUITvới Ctrl- \. Nếu điều này không hoạt động, một lần nữa kiểm tra stty -a | grep quitxem nó đã được thiết lập đúng chưa.

Thiết lập trình mô phỏng đầu cuối

Đồng thời kiểm tra cài đặt cho trình giả lập thiết bị đầu cuối của bạn (nếu bạn đang sử dụng một), có thể có một phím tắt được thiết lập ở cấp độ này (có thể để sao chép hoặc một cái gì đó) và Ctrl- Ckhông đạt đến ptycấp độ. Một phím tắt cũng có thể được thiết lập ở một nơi khác trong môi trường máy tính để bàn hoặc hệ thống Window của bạn.

Một thử nghiệm tốt trên Linux nếu bạn đang sử dụng trình giả lập thiết bị đầu cuối là chuyển sang bảng điều khiển Linux ( Ctrl- Alt- F1), đăng nhập vào đó và xem nếu hành vi tương tự xảy ra. Nếu không thì điều này cho thấy vấn đề nằm ở hệ thống Window hoặc trình giả lập thiết bị đầu cuối của bạn.

Nó có thể là một vấn đề với độ trễ giữa dữ liệu được đọc từ ptythiết bị theo đề xuất của peterph . Nhưng nếu đây là trường hợp và bạn thực sự phải chờ đợi phút để dữ liệu được hiển thị, sau đó chắc chắn là giả lập thiết bị đầu cuối là đệm cách quá nhiều dữ liệu (hoặc máy tính của bạn là rất chậm). Câu trả lời sẽ là tìm cách giảm kích thước bộ đệm trong cài đặt trình giả lập thiết bị đầu cuối của bạn hoặc sử dụng một bộ khác.

Mẹo thêm

Một cái gì đó khác đáng để thêm vào; Tôi thường kết thúc trong cattình huống chạy trốn khi vô tình catmột tệp nhị phân. Tác động khác của việc này có thể là làm hỏng các cài đặt thiết bị đầu cuối của bạn (nếu dữ liệu nhị phân xảy ra khớp với các mã thoát thiết bị đầu cuối khác nhau mà nó thường làm). Nếu tputđược cài đặt (thường là theo mặc định), bạn có thể tránh phải khởi động lại bằng lệnh sau:

tput reset

3

Đây là những gì tmuxtùy chọn c0-change-intervalc0-change-triggerđược thiết kế cho. Bạn vẫn nên sử dụng trình quản lý màn hình cho phiên tiếp tục.


1

Các Ctrl- Otùy chọn đã được trong Unix từ năm 110 ngày baud. Các lệnh mèo chạy trốn luôn là một vấn đề khi một tệp ASCII dài bị đổ tại thiết bị đầu ra chậm và toàn bộ tệp được đặt trong bộ đệm đầu ra trình điều khiển thiết bị. Ctrl- Osẽ bắt đầu xả bộ đệm và theo dõi Ctrl- Osẽ tắt công tắc để con mèo có thể được đọc ở tốc độ bình thường. Ctrl- Ođã được nhập và toàn bộ tệp sẽ xóa và nhanh chóng trả về dấu nhắc lệnh.

Việc các lập trình viên trình điều khiển thiết bị Linux có cảm thấy cần phải tiếp tục thêm tính năng này hay không. Tính năng này đã được thêm ở cấp trình điều khiển thiết bị trong đó Ctrl- SCtrl- Qchỉ có thể được thực hiện. Tôi đã sử dụng điều này để kết xuất các hoạt động sửa lỗi lớn với nhiều bản in séc và sau đó cuộn xuống nơi tôi cần xem.


Ctrl-O dường như không được triển khai trong các Linux hiện đại, ít nhất là không phải máy chủ RHEL hoặc Ubuntu.
dotancohen 24/2/2015

-1

Khi sử dụng bash, bạn có thể tạm dừng công việc bằng cách sử dụng Ctrl+ Zvà sau đó giết nó, bằng cách sử dụng PID hoặc bằng cách làm theo các câu trả lời từ https://stackoverflow.com/questions/1624691/linux-kill-background-task (ví dụ: giết -9 %%)


3
nhưng tôi đang sử dụng tcshvà Ctrl + Z không hoạt động ... đã nêu điều đó trong câu hỏi.
JigarGandhi

vâng, xin lỗi, đã không đọc trong bài đăng của bạn rằng bạn đã thử Ctrl + Z và tôi đã giả định sai rằng Ctrl + Z được xử lý bởi trình bao trái ngược với Ctrl + C do ứng dụng xử lý. Đó là lý do tại sao tôi nghĩ Ctrl + Z hoạt động ngay lập tức trong khi Ctrl + C thì không.
Jannis

-1

mở một giao diện điều khiển mới, ví dụ bằng cách nhấp vào biểu tượng bảng điều khiển hoặc bằng cách nhấn Ctrl+ Alt+ F2. Ở đó, nhập

killall -9 cat

và mèo sẽ bị giết trừ khi bạn có khóa NFS cũ hoặc tình trạng "giấc ngủ không thể gián đoạn" (đọc trên một khu vực xấu không có thời gian chờ).


10
Vấn đề không nằm ở chỗ cat, đó là về những gì catđã ghi vào thiết bị đầu cuối trước khi chết và chưa được đọc, hãy xử lý hoặc hiển thị bởi trình giả lập thiết bị đầu cuối (và đang ngồi trong bộ đệm (khoảng 64kiB trên Linux) bên trong trình điều khiển pty) .
Stéphane Chazelas

Sau đó, vui lòng thử echo 3> / Proc / sys / vm / drop_caches sẽ giảm rất nhiều bộ đệm.
Thorsten Staerk

7
Không, điều đó sẽ chỉ làm giảm dữ liệu được lưu trong bộ nhớ cache không bao giờ những thứ như vậy sẽ ảnh hưởng đến chức năng!
Stéphane Chazelas

4
@ThorstenStaerk drop_cacheskiểm soát các trang được sử dụng làm bộ đệm của kernel (thường là cho hệ thống tệp), không phải bộ đệm bên trong của thiết bị đầu cuối, trình điều khiển mạng và như vậy - nếu có, nó sẽ có hậu quả khá nghiêm trọng như Stéphane đã chỉ ra (về cơ bản bạn sẽ mất dữ liệu) .
peterph

1
Không phải killall -9 catcũng sẽ giết bất kỳ trường hợp mèo nào khác vẫn có thể làm những điều tốt trong các quy trình khác?
Joe

-7

Bạn có thể thử với điều này

Đặt lại sử dụng màn hình -ctrlj

Nếu mèo vẫn chạy thì mở một thiết bị đầu cuối mới và chạy pkill -9 -f cat"Điều này sẽ giết tất cả các quy trình của mèo."


Ctrl + J không hoạt động
JigarGandhi

26
pkill với '-f cat' khá nguy hiểm, vì -f sẽ tìm mẫu 'mèo' trong toàn bộ dòng lệnh, điều này có khả năng xảy ra và gây ra kết quả không mong muốn ...
tonioc

2
Ví dụ: pkill -f cattrên máy tính để bàn của tôi sẽ giết khu vực khay hệ thống trên thanh tác vụ của Xfce4.
Đánh dấu
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.