จะฆ่า soft gui applications ผ่านเทอร์มินัลได้อย่างไร


22

มีวิธีปิดแอปพลิเคชัน GUI อย่างเป็นมิตร " โปรดออกจากตัวคุณเองตอนนี้ " วิธีโดยไม่ต้องเข้าถึงกราฟิกไปยังหน้าต่างแอปพลิเคชันหรือไม่?

ตัวอย่างเช่นหากจอแสดงผล Gnome / X ขัดข้องเป็นสีดำฉันต้องการเปลี่ยนไปใช้แอปพลิเคชัน tty2 และปิดเช่น firefox ด้วยวิธีที่ช่วยให้พวกเขาบันทึกการกำหนดค่าของพวกเขา ฯลฯ ที่ดีที่สุดโดยไม่ต้องสอบถามผู้ใช้เพิ่มเติม

คำตอบ:


19

โดยปกติแล้วคุณสามารถใช้ SIGHUP เพื่อ "ปิด" แอปพลิเคชันได้ง่าย (มีหรือไม่มีส่วนต่อประสานกราฟิก)

kill -HUP <application_pid>

แก้ไข : เพิ่มข้อมูลอื่น ๆ

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

ในอีกด้านหนึ่งฉันต้องยอมรับว่าโดยปกติฉันจะทำตามสคีมานี้:

kill -HUP <application_pid>
# check if application is still running
kill -INT <application_pid>
# check if application is still running
kill -KILL <application_pid>

เห็นได้ชัดว่าคำสั่งสุดท้ายไม่ใช่ "เป็นมิตร"


3
หากคุณไม่รู้จัก PID ของแอปพลิเคชันคุณสามารถใช้pkillเพื่อระบุชื่อของไฟล์ที่เรียกใช้งานได้แทน ตัวอย่างเช่น:pkill -HUP firefox-bin
Caleb

@Dave เกินไป: น่าสนใจฉันพบว่าสิ่งนี้เกี่ยวข้องซึ่งแนะนำลำดับที่คล้ายกัน แต่เปลี่ยนกลับ: TERM-> INT-> HUP (คำนึงถึงอายุเก่า) บางทีฉันจะเก็บ HUP-> INT-> TERM ไว้ในใจเพราะ KILL ดูเหมือนจะไม่เป็นมิตรกับฉัน ขอบคุณทุกคน.
jfk

@Caleb เพียงระวังที่มีหลายกระบวนการที่มีชื่อเดียวกัน: pkillจะฆ่าพวกเขาทั้งหมด sed "s/Woo/woo/" < /dev/urandom >> /dev/null &เช่นทำงานนี้ไม่กี่ครั้งที่จะทำให้กระบวนการพื้นหลังบางส่วน: pkill -HUP sedแล้วทำ คุณจะฆ่าอินสแตนซ์ทั้งหมดของ sed ที่คุณเริ่มต้นรวมถึงอินสแตนซ์อื่น ๆ ที่มีประโยชน์
ahcox

@Caleb ยิ่งไปกว่านั้นpkillยังจะฆ่าปพลิเคชันบางอย่างที่คุณไม่คาดว่าจะ: เช่นถ้าคุณได้chromiumทำงานและต้องการที่จะฆ่าโปรแกรมที่เรียกว่าrom, pkillมีความสุขจะยิงchromiumลง การใช้งานที่ดีขึ้นkillallซึ่งจะตรงกับชื่อที่แน่นอนเท่านั้น (ไม่ใช่ใน Solaris แม้ว่าจะเป็นการฆ่ากระบวนการทั้งหมดอย่างแท้จริง )
Ruslan

@Ruslan หรือใช้pkill -xเพื่อให้ได้การแข่งขันที่แน่นอนแทนการจับคู่บางส่วน ฉันใช้ประโยชน์จากการจับคู่บางส่วนเพื่อบันทึกการพิมพ์ แต่คุณต้องรู้ว่าเครื่องมือทำอะไร ใช่โดยค่าเริ่มต้นจะจับคู่สตริงบางส่วน อีกหนึ่งทางเลือกที่เป็นประโยชน์เพื่อให้ตรงกับบรรทัดคำสั่งเต็มแทนเพียง-f $0
Caleb

5

คุณอาจต้องการลอง:

kill -TERM <pid>

หรือ

kill -TERM `pidof <application_name>`

อย่างน้อยในบางระบบเมื่อระบบปิดการทำงานกระบวนการทั้งหมดจะส่งสัญญาณ TERM (15) ก่อนที่จะส่งสัญญาณ KILL (9) บ่อยครั้งที่ HUP เป็นสาเหตุให้แอปพลิเคชันโหลดการกำหนดค่าใหม่ แต่อาจแตกต่างกันไปในแต่ละกระบวนการ


2

ไม่มีวิธีทั่วไปในการบอกให้แอปพลิเคชันออกและบันทึกการกำหนดค่า อาจมีวิธีในการแจ้งเตือนแอปพลิเคชันโดยใช้เฟรมเวิร์กเฉพาะเช่นdcop kfoo MainApplication-Interface quitสำหรับแอปพลิเคชัน KDE 3 บางตัว โปรดทราบว่าแอปพลิเคชันอาจแสดงกล่องโต้ตอบเพื่อขอให้คุณยืนยัน

หากจอแสดงผล X ไม่สามารถใช้งานได้ให้ฆ่าเซิร์ฟเวอร์ X กดCtrl+ Alt+ BackSpace; ถ้าไม่ได้ทำงานฆ่ากระบวนการ X sudo pkill -x Xorgเซิร์ฟเวอร์ด้วย เมื่อเซิร์ฟเวอร์ X ตายแอปพลิเคชั่น X ทั้งหมดจะได้รับการแจ้งเตือนและพวกเขาจะพยายามออกไปอย่างงดงาม (ไม่มีการรับประกันว่าพวกเขาจะบันทึกทุกอย่าง แต่เป็นทางออกที่ดีที่สุดของคุณ)


ฉันไม่รู้ว่าแอพจะได้รับแจ้งหรือเพิ่งถูกฆ่า และเนื่องจากคำสั่งผสมคีย์ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นใน Fedora ..... ตอนนี้ฉันรู้วิธีการฆ่ามันโดยบรรทัดคำสั่ง!
jfk

1

คล้ายกับคำตอบของ @ andcoz หากคุณไม่รู้จัก PID ของแอปพลิเคชัน (ฉันสมมติว่าคุณไม่ทราบด้วยใจ) ลองสิ่งนี้:

kill -HUP `pidof [application_name]`

2
ทำตามขั้นตอนที่หนึ่งและลองpkill -HUP [application_name]:)
Caleb

เพิ่งเรียนรู้ pkill และ pgrep: D
jfk

1

สองคำสั่งอื่น ๆ ที่คุณอาจต้องการที่จะต้องพิจารณาและwmctrl -c xdotool windowkillฉันไม่แน่ใจว่าwindowkillเป็นสิ่งที่คุณต้องการหรือไม่หากคุณไม่สนใจwindowdeleteแพทช์

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