จะทำอย่างไรเมื่อ Ctrl-C จะไม่ฆ่าการทำงาน?


98

บางครั้งกระบวนการจะไม่สนใจสัญญาณ SIGINT ที่ส่งโดยCtrl- Cใน Bash ยกตัวอย่างเช่นและman viสมมติว่าคุณไม่ต้องการ google หรืออ่านคู่มือเกี่ยวกับวิธีออกจากกระบวนการทำงานมีลำดับของคีย์ใดบ้างที่จะใช้งานได้ตลอดเวลา (โดยไม่ต้องออกจากเทอร์มินัล)

คำตอบ:


141

ส่งSIGQUITสัญญาณ+Ctrl\

.. $ sleep 10
^\Quit

kill -3 pid→นี้จะเทียบเท่ากับ โปรแกรมที่ทำงานในพื้นที่ผู้ใช้อย่าเพิกเฉย sigquit

นอกจากนี้ยังมีชุดแป้นพิมพ์ลัดMagic SysRq Altหนึ่งในคนที่น่าสนใจมากขึ้นคือ: SysRq+ k+ มันฆ่าทุกกระบวนการบนคอนโซลเสมือนปัจจุบัน หากหนึ่งใน ttys ของคุณเสียหายอย่างสมบูรณ์และสมบูรณ์ที่สุดสิ่งนี้สามารถใช้เพื่อย้อนกลับไปได้ บน tty ที่รัน X.org มันสามารถใช้เพื่อฆ่า X โดยปราศจากความเมตตา

คีย์ SysRq นั้นบนแป้นพิมพ์ส่วนใหญ่เหมือนกับปุ่มพิมพ์ ในสมุดบันทึกของฉันสามารถเรียกใช้งานได้โดยใช้ปุ่ม Fn Ie Alt → Fn →พิมพ์→ k ตามลำดับ

นี่คือทางลัดการจัดการกระบวนการพื้นฐานบางส่วน:

  • Ctrl+ Z: หยุดกระบวนการชั่วคราว (บวกbgเพื่อดำเนินการต่อในพื้นหลังfgเพื่อเพิ่มเป็นส่วนหน้า)
  • Ctrl+ C: ขอให้ปิดกระบวนการอย่างสุภาพ
  • Ctrl+ \: สังหารกระบวนการที่อยู่เบื้องหน้าอย่างไร้ความปราณี
  • Alt+ SysRq+ s: เขียนข้อมูลลงดิสก์ (ทำสิ่งนี้เสมอก่อนที่จะฆ่าสิ่งที่สำคัญ)
  • Alt+ SysRq+ s, k: หฤโหดฆ่ากระบวนการทั้งหมดในปัจจุบันบนคอนโซลให้เสมือน
  • Alt+ SysRq+ s, b: หฤโหดรีบูตโดยไม่ unmounting,
  • Alt+ SysRq+ r, e, i, s, u, b: ปลอดภัยr eboot อีเวนฉันsตั้งเป็นU tterly roken,

หมายเหตุ: Ctrl+ Zในทางตรงกันข้ามกับCtrl+ CและCtrl+ \, ยังสามารถใช้ได้กับman, vi, lessและไม่ชอบ

เมื่อสงสัยขั้นตอนการ follwing มักจะใช้ได้เสมอ:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z แน่นอนแสดงว่าได้กดCtrl+ Zแล้ว


หากต้องการข้อมูลเชิงลึกเกี่ยวกับเชลล์และเทอร์มินัลเพิ่มเติมโปรดดูคำตอบของฉันที่:


3
ใช้งานได้สำหรับ "sleep 10" แต่ยังใช้งานไม่ได้กับ "man" หรือ "vi" เห็นได้ชัดว่า "kill -9 pid" ทำงานในการฆ่าทั้งสองกระบวนการ ฉันพลาดอะไรไปรึเปล่า?
Olivier Lalonde

3
Ctrl + Zทำงานร่วมกับสิ่งต่าง ๆ เช่นน้อยกว่าผู้ชาย vi และอื่น ๆ จากนั้นคุณสามารถฆ่าพวกเขาด้วยการทำpsเพื่อดูกระบวนการ id ของพวกเขาและฆ่าพวกเขาใช้kill pidหรือถ้าคุณไม่สนใจเกี่ยวกับกรณีอื่น ๆ killall viของโปรแกรม ไม่ว่าในกรณีใด ๆ Ctrl-Z ดูเหมือนว่าจะทำงานเสมอ
Stefano Palazzo

5
นอกจากนี้คุณยังสามารถทำkill %%เพื่อฆ่างานที่ผ่านมาและkill %5ที่ 5 jobsคือจำนวนงานที่แสดงใน
Olivier Lalonde

2
Ctrl- \ ส่งSIGQUITไม่ใช่ SIGKILL มีความแตกต่างที่สำคัญระหว่าง SIGQUIT และ SIGKILL en.wikipedia.org/wiki/SIGQUIT
Juliano

4
ฉันจะกดCtrl+ \ เมื่อไม่มี\ คีย์ในรูปแบบแป้นพิมพ์ได้อย่างไร
Forivin


8

บางครั้งCTRL+Cการส่งไปยังโปรแกรมผิดหรือช่องสัญญาณเข้า นี่เป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งกับโปรแกรมแก้ไขเช่นvi, ด้วยคำสั่งที่มีเอาต์พุตแบบไพพ์, คำสั่ง bash ที่ซับซ้อนที่เกี่ยวข้องกับลูป, เป็นต้น

ทางออกที่ง่ายและรวดเร็วคือการหยุดงานCTRL+Zแล้วฆ่าด้วยหมายเลขงาน: kill %1หรือkill -9 %1อื่น ๆ


6
  • ลองหนึ่งในสิ่งเหล่านี้:

    Ctrl+4

    Ctrl+\


  • หรือ:

    Ctrl+ Zจากนั้นเรียกใช้:

    kill %1

ที่ไหน%1เป็นจำนวนของงานซึ่งถูกส่งกลับเมื่อคุณกด-Control Zเพิ่ม-9เพื่อบังคับให้ฆ่า


เมื่อคุณอยู่ในคอนโซลข้อความคุณยังสามารถลอง: -Ctrl SysRqเคอร์เนลควรฆ่ากระบวนการ

หรือSysRq- kฆ่ากระบวนการทั้งหมดบนคอนโซลเสมือนปัจจุบัน (สามารถฆ่าโปรแกรม X และ svgalib ได้เช่นกัน)

หมายเหตุ: เมื่อใช้คีย์ Magic SysRq เพื่อฆ่าโปรแกรมกราฟิกแช่แข็งโปรแกรมจะไม่มีโอกาสกู้คืนโหมดข้อความ สิ่งนี้สามารถทำให้ทุกอย่างอ่านไม่ได้

โปรดดู: คีย์ Magic SysRq และชุดคำสั่ง



0

เป็นไปได้ว่าคุณเปลี่ยนทางลัดของการคัดลอกจาก:

CTRL+ SHIFT+C

ไปยัง

CTRL+C

ด้วยวิธีนี้เมื่อคุณพยายามฆ่ากระบวนการCTRL+ Cจะไม่ทำงาน

พยายามที่จะเปลี่ยนทางลัดสำเนาไปCTRL+ +SHIFTC


1
การเปลี่ยนทางลัดการคัดลอกไม่เกี่ยวข้องกับการบังคับให้กระบวนการถูกยกเลิก!
SuB

คุณช่วยขยายคำตอบให้หน่อยได้ไหม? ทีละขั้นตอนจะเหมาะเป็นหลักเพื่อให้ OP สามารถปฏิบัติตามพร้อมกับข้อเสนอแนะของคุณ :)
ThatGuy

สิ่งนี้ช่วยฉันได้จริง ฉันคุ้นเคยกับ CTRL + C บน MacOS และไม่ทราบว่าคำสั่ง Ubuntu คือ CTRL + SHIFT + C
ratskin

-1

ลองCtrl+ Alt+Backspace

หากคุณใช้ Ubuntu 10.04 คุณต้องการเปิดใช้งานปุ่มนี้เพื่อใช้งาน

เพื่อเปิดใช้งานControl- Alt-Backspace

ระบบ Goto -> การตั้งค่า -> คีย์บอร์ด

เลือกแท็บรูปแบบและคลิกที่ตัวเลือกเค้าโครง

เลือกลำดับที่สำคัญที่จะฆ่าเซิร์ฟเวอร์เอ็กซ์และเปิดใช้งานControl+AltBackspace +

บันทึก:

การกดCtrl- Alt- Backspaceจะรีสตาร์ทเซิร์ฟเวอร์ X ของคุณ


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