가출 고양이를 죽이는 방법?


128

여러 번 cat내용이 최대 수천 줄인 파일에서 실수로 명령을 실행했습니다 .

+ 또는 +로 cat명령을 종료 하려고 시도 하지만 둘 다 터미널에 총 출력 이 표시된 후에 만 적용 되므로 완전히 실행될 때까지 기다려야 합니다.CtrlCCtrlZcatcat

기다리는 것을 피하는 더 나은 해결책이 있습니까? 때로는 파일 크기가 최대 100MB이므로 기다릴 때 짜증이납니다.

사용하고 tcsh있습니다.


14
더, 덜, 꼬리, 머리와 같은 명령을 사용하는 것이 고양이의 흥미로운 대안이 될 수 있습니다. (물론 이것은 답이 아닙니다 ...)
tonioc

25
내가 읽은 가장 큰 질문 제목이었습니다. 질문의 링크가 UL과 관련이 있음을 알 때까지는 절대 고양이를 죽이는 데 도움이 필요하다고 생각했습니다.
Lenz

5
다른 SE 사이트의 사이드 바 질문에 이중 테이크를 수행합니까 질문 옆에 "UL"로고가 표시되는 것이 매우 안심 입니다. 신경 쓰지 마 (보통 문맥에
맞지 않는

12
나는 curiosity명령 을 시도 할 것입니다 ...
Sekhemty

4
alias curiosity='sudo killall cat'
cas

답변:


76

해당 파일에 실제로 많은 양의 데이터가 포함되어 있으면 신호가 실제로 cat끝나기 전에 도달 할 수 있습니다 . 당신이 실제로 관찰하는 것은 터미널의 유한 속도입니다-터미널 cat에 데이터를 보내고 터미널이 모든 것을 표시하는 데 시간이 걸립니다.

일반적으로 각 출력 줄에 대해 전체 출력 창을 다시 그려야합니다 (즉, 창의 내용을 한 줄 위로 이동하고 맨 아래에 다음 줄을 인쇄해야 함). 간단한 방법보다 더 빠르게 수행 할 수있는 기술과 알고리즘이 있지만 여전히 시간이 걸립니다.

따라서 가능한 빨리 출력을 제거 하려면 터미널 창을 숨기십시오 . 일반적으로 실제 다시 그리기가 수행되지 않기 때문입니다. 그래픽 환경에서 이는 창을 최소화하거나 다른 가상 데스크톱으로 전환하는 것을 의미 할 수 있습니다. Linux 가상 콘솔에서 다른 가상 데스크톱으로 전환하면됩니다 (( Ctrl+) Alt+ ).Fx

또한 느린 네트워크 링크 (예 : GSM 연결을 통한 SSH)를 통해이를 실행 cat하면 터미널 속도가 더 이상 병목 현상이 발생하지 않기 때문에 신호로 인해 죽기 전에 훨씬 적은 출력을 볼 수 있습니다. .


6
느린 SSH 파이프가 다운 될 때까지 데이터를 기다리는 경우 OpenSSH 이스케이프 시퀀스를 사용하여 연결을 닫을 수 있습니다. 새 줄에 입력 ~?하여 사용 가능한 옵션을 확인하십시오 ( ~.닫기).
RJHunter

11
또한 Ctrl + S를 사용하여 출력을 중지하십시오 tty-stop-output. 그런 다음 Ctrl + C를 보낼 수 있습니다. 출력을 재개하려면 Ctrl + Q를 누르십시오.
Martin Tournoij

1
@Carpetsmoker 우분투 14.04 + 터미네이터 + zsh에서 텍스트 흐름을 멈추지 않았다는 것을 테스트했습니다.
muru

@muru 감사합니다. 나는 그것을 테스트하려고했지만 문제를 재현 할 수 없었습니다 (시스템이 너무 빠르거나 보이거나 열심히 노력하지 않았습니다).
Martin Tournoij

4
@Carpetsmoker이 경우 (빠른 터미널 링크의) 소프트웨어 흐름 제어 (Ctrl + S)는 그다지 도움이되지 않습니다. 데이터는 이미 터미널 버퍼에 있으며 터미널이 처리하기를 기다리고 있습니다. 따라서 Ctrl + S는 응용 프로그램에 더 많은 데이터 전송을 중지하라고 지시 하지만 이미 전송 된 내용은 계속 표시해야합니다.
peterph

4

터미널 설정

나는 이것이 버퍼링 문제보다 터미널 설정 방법과 더 관련이 있다고 생각합니다. 의 출력을 확인 stty -a | grep intr당신이해야 intr = ^C;하는 경우 출력 라인에 Ctrl- C상기 활성화 tty/ pty. 그렇지 않은 경우 사용할 stty intr ^C수 있습니다. 에 줄을 추가 .tcshrc하거나 .login영구적으로 만드십시오 (또는 처음에 변경하는 줄을 삭제하십시오!).

실패 Ctrl- C, 당신은 또한 전송 시도 할 수 있습니다 SIGQUIT으로 Ctrl- \. 그래도 문제가 해결되지 않으면 다시 설정되어 있는지 확인 stty -a | grep quit하십시오.

터미널 에뮬레이터 설정

(당신이 하나를 사용하는 경우) 또한 터미널 에뮬레이터의 설정을 확인, 거기 (아마 복사 또는 무언가)이 수준에서 설정 바로 가기하고 있다고 할 수있다 Ctrl- C손이 닿지 않는 pty수준. 바탕 화면 환경 또는 Window 시스템의 다른 곳에 바로 가기를 설정할 수도 있습니다.

(터미널 에뮬레이터를 사용하는 경우 리눅스에 좋은 테스트는 리눅스 콘솔로 전환하는 것입니다 Ctrl- Alt- F1거기에 로그인과 같은 문제가 발생하는 경우 참조). 그렇지 않으면 Windows 시스템 또는 터미널 에뮬레이터에 문제가 있음을 나타냅니다.

peterph가pty 제안한대로 장치 에서 데이터를 읽는 간격이 문제 일 수 있습니다 . 이 경우 당신은 실제로 데이터가 표시 될 때까지 분을 기다려야 할 경우, 그때 확실히 터미널 에뮬레이터는 버퍼링이다 방법 너무 많은 데이터가 (또는 PC가 매우 느립니다). 대답은 터미널 에뮬레이터 설정에서 해당 버퍼 크기를 줄이거 나 다른 것을 사용하는 방법을 찾는 것입니다.

추가 팁

추가 할만한 가치가있는 것; cat실수 cat로 이진 파일을 사용하는 경우 일반적으로 런 어웨이 상황이 발생 합니다. 이것의 다른 효과는 터미널 설정을 망칠 수 있습니다 (이진 데이터가 종종 발생하는 다양한 터미널 이스케이프 코드와 일치하는 경우). 경우 tput(일반적으로 디폴트로) 설치, 다음과 같은 명령을 다시 시작하지 방지 할 수 있습니다 :

tput reset

3

이것이 어떤 tmux옵션 c0-change-interval이며 c0-change-trigger설계되었습니다. 어쨌든 재개 가능한 세션에는 화면 관리자를 사용해야합니다.


1

Ctrl- O옵션은 110 보드 시절부터 유닉스되었습니다. 런 어웨이 고양이 명령은 긴 ASCII 파일이 느린 출력 장치에 덤프되고 전체 파일이 장치 드라이버 출력 버퍼에 배치 될 때 항상 문제가되었습니다. Ctrl- O버퍼 세척을 시작하고 후속 조치 Ctrl- O세척을 해제하여 고양이가 정상 속도로 읽을 수 있도록합니다. Ctrl- O를 입력하면 전체 파일이 플러시되고 명령 프롬프트가 빠르게 반환됩니다.

Linux 장치 드라이버 코더가이 기능을 계속 추가 할 필요성을 느꼈는지 여부는 알려져 있지 않습니다. 이 기능은 CtrlSCtrl- Q만 구현할 수 있는 장치 드라이버 수준에서 추가되었습니다 . 나는 이것을 사용하여 많은 수표 인쇄로 큰 디버깅 실행을 덤프 한 다음 볼 필요가있는 곳으로 스크롤합니다.


Ctrl-O는 최소한 RHEL 또는 Ubuntu 서버가 아닌 최신 Linux에서는 구현되지 않는 것 같습니다.
dotancohen

-1

bash를 사용할 때 Ctrl+를 사용하여 작업을 일시 중단 Z한 다음 PID를 사용하거나 https://stackoverflow.com/questions/1624691/linux-kill-background-task 의 응답을 따라 작업을 중단 할 수 있습니다 (예 : kill -9 %%)


3
하지만 사용 tcsh중이며 Ctrl + Z가 작동하지 않습니다 ... 이미 문제가 있다고 언급했습니다.
JigarGandhi

네, 죄송합니다, 귀하의 게시물에서 Ctrl + Z를 시도했다는 것을 읽지 못했고 Ctrl + Z가 응용 프로그램에서 처리하는 Ctrl + C와 달리 쉘에서 처리한다고 잘못 가정했습니다. 그래서 Ctrl + C는 작동하지 않지만 Ctrl + Z는 즉시 작동한다고 생각했습니다.
Jannis

-1

예를 들어 콘솔 아이콘을 클릭하거나 Ctrl+ Alt+ 를 눌러 새 콘솔을 엽니 다 F2. 거기에 입력

killall -9 cat

부실한 NFS 잠금 또는 "무정전 수면"상황이 없으면 고양이가 종료됩니다 (시간 초과가 설정되지 않은 불량 섹터에서 읽음).


10
문제는로 끝나지 않았으며 cat, cat죽기 전에 터미널에 쓴 내용 과 터미널 에뮬레이터가 아직 처리하거나 표시하지 않고 읽지 않은 것입니다 (pty 드라이버 내부의 (Linux의 경우 64kiB 정도) 버퍼에 앉아 있음) .
Stéphane Chazelas

그런 다음 echo 3> / proc / sys / vm / drop_caches를 시도하여 많은 버퍼를 삭제하십시오.
Thorsten Staerk

7
아니요, 캐시 된 데이터 만 삭제하면 기능에 영향을 줄 수있는 그런 데이터는 절대 없어집니다!
Stéphane Chazelas

4
@ThorstenStaerk drop_caches는 터미널, 네트워크 드라이버 등의 내부 버퍼가 아닌 커널이 캐시로 사용하는 페이지 (일반적으로 파일 시스템에 사용)를 제어합니다. .
peterph

1
는하지 않을까요 killall -9 cat도 여전히 다른 프로세스 스레드에서 좋은 일을 할 수있는 다른 고양이 인스턴스를 죽일?
Joe

-7

이것으로 시도해 볼 수 있습니다

디스플레이 사용 재설정 -ctrlj

cat이 여전히 실행 중이면 새 터미널을 열고 pkill -9 -f cat"이 작업을 수행하면 모든 cat 프로세스가 종료됩니다."


Ctrl + J 가 작동하지 않음
JigarGandhi

26
'-f cat'을 사용한 pkill은 매우 위험합니다. -f는 발생할 수있는 전체 명령 행에서 'cat'패턴을
찾고

2
예를 들어, pkill -f cat데스크탑에서 Xfce4 작업 표시 줄의 시스템 트레이 영역이 종료됩니다.
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.