จะฆ่าแมวที่หนีไม่พ้นได้อย่างไร


128

หลายครั้งที่ฉันรันcatคำสั่งบนไฟล์ที่มีเนื้อหามากถึงสองสามพันบรรทัดโดยไม่ตั้งใจ

ฉันพยายามฆ่าcatคำสั่งด้วยCtrl+ CหรือCtrl+ Zแต่ทั้งคู่จะมีผลเฉพาะหลังจากที่แสดงผลลัพธ์ทั้งหมดcatในเทอร์มินัลดังนั้นฉันต้องรอจนกว่าcatจะได้รับการดำเนินการอย่างสมบูรณ์

มีวิธีแก้ปัญหาที่ดีกว่าที่หลีกเลี่ยงการรอ? เพราะบางครั้งไฟล์มีขนาดไม่เกิน 100MB และทำให้เกิดความรำคาญที่จะรอ

tcshฉันใช้


14
การใช้คำสั่งเช่นหางน้อยมากหัวอาจเป็นทางเลือกที่น่าสนใจสำหรับแมว (แน่นอนว่านี่ไม่ใช่คำตอบ ... )
tonioc

25
นั่นคือคำถามที่ยิ่งใหญ่ที่สุดที่ฉันเคยอ่าน จนกว่าฉันจะเห็นว่าลิงก์ของคำถามนั้นมีไว้สำหรับ UL ฉันคิดว่าคุณต้องการความช่วยเหลือในการฆ่าแมวที่น่ารังเกียจ
Lenz

5
ไม่สองครั้งใช้เวลาคำถามแถบด้านข้างจากเว็บไซต์ SE อีก คือโล่งใจมากที่จะเห็น "UL" โลโก้ต่อไปที่จะตั้งคำถาม ไม่เป็นไรดำเนินการต่อ (โดยปกติมันเป็น Arquade ที่มีชื่อคำถามที่ดูผิดไปจากบริบท)
LindaJeanne

12
ฉันจะลองcuriosityคำสั่ง ...
Sekhemty

4
alias curiosity='sudo killall cat'
cas

คำตอบ:


76

หากไฟล์ดังกล่าวมีข้อมูลจำนวนมากที่ส่งสัญญาณได้จริง ๆcatก่อนที่จะเสร็จสิ้น สิ่งที่คุณสังเกตเห็นจริงๆคือความเร็ว จำกัด ของเครื่องของคุณ - catส่งข้อมูลไปยังเครื่องปลายทางและใช้เวลาสักครู่สำหรับเครื่องที่จะแสดงผลทั้งหมด

โปรดจำไว้ว่าโดยปกติจะต้องวาดหน้าต่างออกทั้งหมดสำหรับแต่ละบรรทัดของเอาต์พุต (เช่นย้ายเนื้อหาของหน้าต่างหนึ่งบรรทัดขึ้นไปแล้วพิมพ์บรรทัดถัดไปที่ด้านล่าง) ในขณะที่มีเทคนิคและอัลกอริธึมที่จะทำให้สิ่งนี้เร็วกว่าการทำแบบตรงไปตรงมา แต่ก็ยังต้องใช้เวลาพอสมควร

ดังนั้นหากคุณต้องการกำจัดผลลัพธ์โดยเร็วที่สุดให้ซ่อนหน้าต่างเทอร์มินัลเพราะโดยปกติแล้วจะไม่มีการวาดใหม่เกิดขึ้นจริง ในสภาพแวดล้อมแบบกราฟิกนี่อาจหมายถึงการย่อขนาดหน้าต่างหรือเปลี่ยนเป็นเดสก์ท็อปเสมือนที่แตกต่างกันบนคอนโซลเสมือนของ Linux เพียงแค่เปลี่ยนไปใช้อีกตัวหนึ่ง (( Ctrl+) Alt+ )Fx

นอกจากนี้โปรดสังเกตว่าหากคุณใช้งานผ่านการเชื่อมโยงเครือข่ายที่ช้า (เช่น SSH ผ่านการเชื่อมต่อ GSM) คุณจะเห็นผลลัพธ์ที่น้อยลงก่อนที่สัญญาณจะcatถูกฆ่าเนื่องจากความเร็วของเทอร์มินัลจะไม่เป็นปัญหาอีกต่อไป .


6
หากคุณกำลังรอข้อมูลที่จะมาลงท่อ SSH ช้าคุณสามารถใช้ลำดับหนี OpenSSH เพื่อปิดการเชื่อมต่อ ในบรรทัดใหม่พิมพ์~?เพื่อดูตัวเลือกที่มีอยู่ ( ~.ปิด)
RJHunter

11
นอกจากนี้คุณยังพยายามหยุดการส่งออกด้วยการกด Ctrl + S tty-stop-outputซึ่งจะส่ง จากนั้นคุณสามารถส่ง Ctrl + C หากต้องการกลับมาทำงานต่อให้กด Ctrl + Q ...
Martin Tournoij

1
@Carpetsmoker ทดสอบแล้วว่าไม่หยุดการไหลของข้อความสำหรับฉันบน Ubuntu 14.04 + terminator + zsh
muru

@muru ขอบคุณ ฉันพยายามทดสอบ แต่ไม่สามารถสร้างปัญหาขึ้นมาใหม่ได้ (ระบบของฉันเร็วเกินไปมันอาจดูเหมือนหรือฉันอาจจะพยายามไม่มากพอ)
Martin Tournoij

4
@Carpetsmoker ฉันกลัวการควบคุมการไหลของซอฟต์แวร์ (ซึ่งเป็น Ctrl + S) จะไม่ช่วยอะไรมากในกรณีนี้ (จากลิงค์ด่วน) - ข้อมูลอยู่ในบัฟเฟอร์ของเทอร์มินัลแล้วและรอให้เครื่องประมวลผล ดังนั้น Ctrl + S จะบอกให้แอปพลิเคชันหยุดส่งข้อมูลเพิ่มเติมแต่สิ่งที่ได้ส่งไปแล้วจะยังคงปรากฏอยู่
เตอร์

4

การตั้งค่าเทอร์มินัล

ฉันคิดว่านี่เป็นเรื่องเกี่ยวกับวิธีการตั้งค่าเครื่องเทอร์มินัลมากกว่าปัญหาการบัฟเฟอร์ใด ๆ ตรวจสอบการส่งออกของstty -a | grep intrคุณควรจะมีintr = ^C;ในบรรทัดที่ส่งออกถ้าCtrl- Cมีการใช้งานที่/tty ptyหากไม่เป็นเช่นนั้นคุณสามารถใช้stty intr ^Cเพื่อเปิดใช้งาน เพิ่มบรรทัดลงใน.tcshrcหรือ.loginเพื่อทำให้ถาวร (หรือลบบรรทัดที่เปลี่ยนแปลงในตอนแรก!)

ความล้มเหลวCtrl- Cคุณยังสามารถลองส่งSIGQUITด้วย-Ctrl \หากวิธีนี้ใช้ไม่ได้ผลให้ตรวจสอบอีกครั้งstty -a | grep quitเพื่อดูว่าตั้งค่าไว้ถูกต้องหรือไม่

การตั้งค่า Terminal Emulator

นอกจากนี้ตรวจสอบการตั้งค่าสำหรับจำลอง terminal ของคุณ (หากคุณกำลังใช้อย่างใดอย่างหนึ่ง) ก็อาจเป็นได้ว่ามีทางลัดการตั้งค่าในระดับนี้ (อาจจะสำหรับการคัดลอกหรืออะไร) และCtrl- Cไม่ถึงptyระดับ ทางลัดอาจถูกตั้งค่าที่อื่นในสภาพแวดล้อมเดสก์ท็อปของคุณหรือระบบ Window

การทดสอบที่ดีเกี่ยวกับ Linux หากคุณใช้เทอร์มินัลอีมูเลเตอร์คือการเปลี่ยนไปใช้คอนโซล Linux ( Ctrl- Alt- F1) ล็อกอินที่นั่นและดูว่ามีพฤติกรรมแบบเดียวกันหรือไม่ หากไม่เป็นเช่นนั้นนี่เป็นการชี้ให้เห็นว่าปัญหาอยู่ที่ระบบ Window หรือเทอร์มินัลอีมูเลเตอร์ของคุณ

มันอาจจะเป็นปัญหาที่มีความล่าช้าระหว่างข้อมูลที่ถูกอ่านจากที่ptyอุปกรณ์ที่แนะนำโดยpeterph แต่ถ้าเป็นกรณีนี้และคุณไม่จริงต้องรอนาทีเพื่อให้ข้อมูลที่จะแสดงแล้วแน่นอนจำลอง terminal เป็นบัฟเฟอร์ทางข้อมูลที่มากเกินไป (หรือเครื่องคอมพิวเตอร์ของคุณช้ามาก) คำตอบคือหาวิธีลดขนาดบัฟเฟอร์ในการตั้งค่าเทอร์มินัลอีมูเลเตอร์ของคุณหรือใช้วิธีอื่น

เคล็ดลับพิเศษ

สิ่งอื่นที่ควรค่าแก่การเพิ่ม; ฉันมักจะจบลงในcatสถานการณ์ที่หลบหนีเมื่อฉันบังเอิญcatไฟล์ไบนารี ผลกระทบอื่นของสิ่งนี้คือการทำให้การตั้งค่าเครื่องของคุณแย่ลง (หากข้อมูลเลขฐานสองเกิดขึ้นเพื่อให้ตรงกับรหัสการหลบหนีของเครื่องปลายทางที่มักจะทำ) หากtputมีการติดตั้ง (โดยปกติจะเป็นค่าเริ่มต้น) คุณสามารถหลีกเลี่ยงการเริ่มต้นใหม่ด้วยคำสั่งต่อไปนี้:

tput reset

3

นี่คือtmuxตัวเลือกc0-change-intervalและการc0-change-triggerออกแบบสำหรับ คุณควรใช้โปรแกรมจัดการหน้าจอสำหรับเซสชันที่ทำงานต่อได้


1

Ctrl- Oตัวเลือกที่ได้รับใน Unix ตั้งแต่ 110 วันบอด คำสั่ง Runaway cat มักจะมีปัญหาเสมอเมื่อมีการทิ้งไฟล์ ASCII ขนาดยาวที่อุปกรณ์เอาต์พุตช้าและไฟล์ทั้งหมดที่อยู่ในบัฟเฟอร์เอาต์พุตไดรเวอร์อุปกรณ์ Ctrl- Oจะเริ่มล้างของบัฟเฟอร์และติดตามCtrl- Oจะสลับปิดล้างเพื่อให้แมวสามารถอ่านได้ที่ความเร็วปกติ Ctrl- Oถูกป้อนและไฟล์ทั้งหมดจะถูกลบทิ้งและส่งคืนพร้อมรับคำสั่งอย่างรวดเร็ว

ไม่ว่าจะเป็นโคเด็นของไดรเวอร์อุปกรณ์ Linux หรือไม่รู้สึกว่าจำเป็นต้องเพิ่มคุณสมบัตินี้ต่อไปไม่ทราบ คุณสมบัตินี้ได้รับการเพิ่มในระดับไดรเวอร์อุปกรณ์ซึ่งCtrl- SและCtrl- Qสามารถนำไปใช้งานได้เท่านั้น ฉันใช้สิ่งนี้เพื่อถ่ายโอนข้อมูลการดีบักขนาดใหญ่ที่มีการพิมพ์เช็คจำนวนมากจากนั้นเลื่อนลงไปยังตำแหน่งที่ฉันต้องการดู


Ctrl-O ดูเหมือนจะไม่ถูกนำมาใช้ใน Linux ที่ทันสมัยอย่างน้อยก็ไม่ใช่เซิร์ฟเวอร์ RHEL หรือ Ubuntu
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 + Z ทำงานได้ทันทีในขณะที่ Ctrl + C ไม่ทำงาน
Jannis

-1

เปิดคอนโซลใหม่ตัวอย่างเช่นโดยการคลิกบนไอคอนคอนโซลหรือโดยการกดCtrl+ +Alt F2ที่นั่นใส่

killall -9 cat

และ cat จะถูกฆ่าเว้นแต่คุณจะได้ล็อค NFS เก่าหรือสถานการณ์ "uninterruptible sleep" (อ่านเซกเตอร์ที่ไม่ดีโดยไม่มีการตั้งค่าการหมดเวลา)


10
ปัญหาไม่ได้เกิดขึ้นcatกับสิ่งที่catเขียนไปยังเทอร์มินัลก่อนที่จะตายและยังไม่ได้อ่านให้ประมวลผลหรือแสดงผลโดยเทอร์มินัลอีมูเลเตอร์ แต่เพียงอย่างเดียว (และนั่งอยู่ในบัฟเฟอร์ (ประมาณ 64kiB ขนาดใหญ่บน Linux) .
Stéphane Chazelas

จากนั้นโปรดลอง echo 3> / proc / sys / vm / drop_caches ซึ่งจะลดจำนวนบัฟเฟอร์เช่นกัน
Thorsten Staerk

7
ไม่นั่นจะทำให้ข้อมูลที่เก็บไว้ในแคชไม่เคยเป็นอย่างนั้นเพราะจะส่งผลต่อการทำงาน!
Stéphane Chazelas

4
@ThorstenStaerk drop_cachesควบคุมหน้าเว็บที่ใช้เป็นแคชโดยเคอร์เนล (โดยปกติจะเป็นระบบไฟล์) ไม่ใช่บัฟเฟอร์ภายในของเทอร์มินัลไดรเวอร์เครือข่ายและอื่น ๆ - หากทำเช่นนั้นจะมีผลร้ายแรงมากตามที่Stéphaneชี้ (โดยทั่วไปคุณสูญเสียข้อมูล) .
peterph

1
จะไม่killall -9 catฆ่า cat instance อื่น ๆ ที่อาจยังคงทำสิ่งที่ดีในเธรดกระบวนการอื่นหรือไม่
Joe

-7

คุณสามารถลองกับสิ่งนี้

รีเซ็ตการใช้จอแสดงผล-ctrlj

หาก cat ยังคงทำงานอยู่ให้เปิดเทอร์มินัลใหม่แล้วเรียกใช้งาน pkill -9 -f cat"สิ่งนี้จะทำให้กระบวนการแมวทั้งหมด"


Ctrl + Jไม่ทำงาน
JigarGandhi

26
pkill กับ '-f cat' ค่อนข้างอันตรายเนื่องจาก -f จะมองหารูปแบบ 'cat' ในบรรทัดคำสั่งทั้งหมดซึ่งมีแนวโน้มที่จะเกิดขึ้นและทำให้เกิดผลลัพธ์ที่ไม่พึงประสงค์ ...
tonioc

2
ตัวอย่างเช่นpkill -f catบนเดสก์ท็อปของฉันจะฆ่าพื้นที่ถาดระบบของทาสก์บาร์ของ Xfce4
ทำเครื่องหมาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.