วิธียกเลิกคำสั่งที่ติดอยู่ในเซิร์ฟเวอร์ ubuntu


11

ฉันรู้ว่ามีctrl+ cแต่บางครั้งก็ใช้ไม่ได้ ในเดสก์ท็อป Ubuntu ฉันสามารถปิดหน้าต่างเทอร์มินัลและเปิดใหม่เมื่อเกิดเหตุการณ์นี้ แต่จะแก้ไขได้อย่างไรโดยใช้ CLI ในเซิร์ฟเวอร์ Ubuntu (โดยไม่ต้องรีสตาร์ทกล่อง)


คำตอบ:


21

CTRL+Cจะส่งSIGINTไปที่แอปพลิเคชัน แอปพลิเคชันสามารถกำหนดค่าตัวจัดการสำหรับสัญญาณนี้หรือสามารถละเว้นสัญญาณ โดยค่าเริ่มต้นจะไม่มีตัวจัดการและSIGINTจะฆ่าแอปพลิเคชัน

คุณสามารถใช้ซึ่งจะส่งCTRL+\ SIGQUITสิ่งนี้จะสร้างแกนดัมพ์ถ้าขีด จำกัด หลักไม่ใช่ศูนย์

คุณสามารถระงับกระบวนการและกลับสู่เชลล์ได้ด้วยCTRL+Zวิธีนี้จะหยุดการดำเนินการของกระบวนการและกลับไปที่เชลล์พรอมต์ กระบวนการจะอยู่ในหน่วยความจำและจะพร้อมใช้งานเป็นงานในเชลล์ปัจจุบัน จากนั้นคุณสามารถใช้kill -SIGNAL %%หรือkill -SIGNAL %<job_ID>เพื่อส่งสัญญาณไปยังงานนั้น เช่นฆ่างานสุดท้ายที่ใช้kill -9 %%

หากไม่มีสิ่งใดที่ทำงานคุณสามารถส่งได้ตลอดเวลาSIGTERMซึ่งเป็นทางเลือกสุดท้ายSIGKILLซึ่งจะยุติกระบวนการใด ๆ สัญญาณนี้เป็นสัญญาณอื่น ๆ จะต้องส่งเป็นผู้ใช้เดียวกันกับกระบวนการที่คุณพยายามหยุดหรือเป็นราก หากต้องการส่งSIGKILLไปยังกระบวนการอันดับแรกให้ค้นหากระบวนการที่มีps auxหรือps -edfจากนั้นเรียกใช้kill -SIGKILL <process_ID>โดยที่<process_ID>คือPIDคอลัมน์ในpsเอาต์พุต

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

หากกระบวนการกลายเป็นซอมบี้มันจะไม่ใช้ทรัพยากรใด ๆ เพียงแค่เพิ่มพื้นที่ในตารางกระบวนการ กระบวนการซอมบี้ไม่สามารถรับสัญญาณได้

รายการสัญญาณสำหรับสถาปัตยกรรมปัจจุบันสามารถพบได้ kill -l

ดูหน้าคนของkill, และps bashเพื่อดูหน้าคนใช้สิ่งที่ชอบ:man ps


2

หากคุณมีสิทธิ์เข้าถึงคอนโซลอย่างสมบูรณ์คุณสามารถทำได้Alt- F1..12และรับคอนโซลใหม่

จากตรงนั้นคุณสามารถทำรายการกระบวนการดังนี้:

ps aux | grep <process-name>

จากนั้นทำkillID กระบวนการ:

kill -9 <pid>

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


1

Ctrl C ส่ง SIGINT ไปยังกระบวนการทำงานของคุณ หากคุณไม่ต้องการเปิดคอนโซลอื่นคุณสามารถส่ง SIGQUIT ด้วย Ctrl \ แอปนี้จะจัดการกับแอปที่ใช้เป็นประจำทุกวันซึ่ง SIGINT จะไม่ทำ

ฉันต้องการส่ง SIGKILL ด้วยทางลัดเป็นการส่วนตัว แต่ฉันไม่ทราบวิธีการทำเช่นนั้น


1

ฉันพิจารณาpgrepและpkillใช้งานง่ายกว่าkillด้วยรหัสกระบวนการที่ชัดเจน

นอกจากนี้แทนที่จะเริ่มด้วยสัญญาณ 9 (SIGKILL) ให้พิจารณาเริ่มต้นด้วย SIGTERM เริ่มต้น (15) นี่จะเป็นการเปิดโอกาสให้กระบวนการยุติอย่างสง่างาม (ถ้าทำได้) pkill -15 thingและpkill thingควรจะเทียบเท่า

นี่คือวิธีที่จะทำงาน สมมติว่า ntpd ถูกแขวน

กระบวนการคืออะไร? (คุณสามารถข้ามไปที่ pkill หากคุณเชื่อว่าคุณจะไม่มีผลบวกปลอม)

$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd

ฆ่ากระบวนการ:

$ pkill ntpd

ใช้pgrepอีกครั้งเพื่อดูว่าสำเร็จหรือไม่

pkill -9ถ้าไม่ได้ในที่สุดก็ย้ายไป


0

คุณจะเปลี่ยนเป็นเทอร์มินัลใหม่ค้นหา PID ของกระบวนการที่ค้างอยู่ (โดยใช้ps) จากนั้นใช้killเพื่อฆ่ากระบวนการ kill (PID)ครั้งแรกที่ผมจะใช้ kill -9 (PID)หากไม่ได้ทำงานผมจะใช้ หากไม่ได้หยุดกระบวนการต้องรีบูทเครื่อง


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