สิ้นสุดกระบวนการใน Unix แทนที่จะขัดจังหวะมัน


12

ที่Unixบรรทัดรับคำสั่งถ้าฉันกดCtrl-Cนั่นไม่ได้จบกระบวนการ แต่ขัดจังหวะมันและฉันกลับไปที่เชลล์พรอมต์

ดังนั้นฉันมีคำถามสองข้อต่อไปนี้:

    1. มีวิธีที่ฉันสามารถดูรายการของกระบวนการขัดจังหวะและสิ้นสุดพวกเขา?
    1. คีย์ผสมใดที่จะกดเพื่อยุติกระบวนการแทนที่จะขัดจังหวะกระบวนการ

คำตอบ:


20

Ctrl+ ส่งC SIGINTโดยค่าเริ่มต้นนี้จะยกเลิกแอปพลิเคชัน

คุณกำลังสับสนกับสิ่งนี้Ctrl-Zซึ่งระงับแอปพลิเคชันด้วยการทุบตี


7

ในอดีตมีสัญญาณสามอย่างที่ถูกผูกไว้กับการกดแป้นเหล่านี้

  • SIGINT (ขัดจังหวะ) มักจะCtrl+ CหรือDel
  • SIGQUIT - ออก - โดยปกติผูกกับCtrl+\
  • SIGSUSP Suspend - โดยปกติจะมีCtrlเครื่องหมาย +Z

ในบางรสชาติ * ระวังยังมีสัญญาณอื่น ๆ ที่ถูกผูกไว้คุณสามารถตรวจสอบการเชื่อมคีย์บอร์ดโดยใช้คำสั่ง

stty -a

บนระบบของฉัน OS / X สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

โปรดทราบว่า kill ในอินสแตนซ์นี้ไม่ใช่สัญญาณ KILL ที่เกี่ยวข้องกับการล้างอินพุตบัฟเฟอร์ปัจจุบัน

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

ไม่มีแนวคิดเกี่ยวกับรายการกระบวนการ "ขัดจังหวะ" เนื่องจากกระบวนการตรวจจับและละเว้นกระบวนการขัดจังหวะหรือมีการออก คุณสามารถรับรายการกระบวนการที่ถูกระงับได้โดยการพิมพ์งาน


มันน่าสนใจที่ฉันมี ^ Q และ ^ S กำลังแสดง (เช่นคุณ) แต่ได้ตั้งไว้stty -ixonเพื่อให้พวกเขาผ่านไปได้ <undef>ฉันคิดว่าพวกเขาจะเปลี่ยนไป
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ฉันไม่พบ SIGSUSP ในหน้าคู่มือของกล่อง OS X หรือกล่อง Debian Lenny ของฉัน ดูเหมือนว่าจะเป็น SIGTSTP
dmckee --- ผู้ดูแลอดีตลูกแมว

DEL - อ๊ะแผน 9 ...
123456

5

มีคำตอบที่ถูกต้องมากมาย แต่ไม่มีคำตอบที่สมบูรณ์

  1. ดังที่คนอื่น ๆ พูด: Control-C ส่งสัญญาณยูนิกซ์ SIGINT และพฤติกรรมเริ่มต้น (จากโปรแกรมที่ไม่ได้เขียนทับ) คือ "ยุติกระบวนการ" โปรแกรมสามารถละเว้นสัญญาณนี้หรือดำเนินการอื่นหากต้องการ
  2. คุณสามารถส่ง SIGQUIT จากแป้นพิมพ์ด้วย Control- \ ความแตกต่างที่นี่คือโดยค่าเริ่มต้นกระบวนการจะเขียนไฟล์หลักแล้วออกจาก โปรแกรมสามารถละเว้นสัญญาณนี้หรือดำเนินการอื่นหากต้องการ
  3. หากต้องการยุติด้วยอคติที่รุนแรงและไม่อนุญาตให้กระบวนการหยุดคุณใช้ SIGKILL ซึ่งไม่ได้ผูกไว้กับคีย์ใด ๆ โดยค่าเริ่มต้น โดยทั่วไปคุณจะส่งมันโดยใช้kill (1)คำสั่งและระบุสัญญาณที่จะส่งเป็น

    $ kill -9 <process ID>
    

    หรือช่วยในการจำ

    $ kill -KILL <process ID>
    

    สัญญาณนี้ได้รับการจัดการโดยตรงจากระบบปฏิบัติการและโปรแกรมไม่สามารถแทนที่พฤติกรรมเริ่มต้น

  4. ถ้าเปลือกของคุณสนับสนุนการควบคุมงานก็ยังอาจสนับสนุนการสร้างขึ้นในรุ่นkillที่รองรับบัตรประจำตัวงานโดยใช้%ตัวละครในขณะที่คำตอบของแคทวอล์

  5. ในการหยุดกระบวนการชั่วคราวด้วยวิธีที่สามารถใช้งานต่อได้คุณใช้ Control-z ซึ่งจะส่ง SIGTSTP คุณกลับสู่กระบวนการดังกล่าวโดยfgดำเนินการควบคุมเทอร์มินัลbgต่อไปหรือตั้งค่าให้ทำงานโดยไม่ควบคุมเทอร์มินัล (โดยค่าเริ่มต้นจะยังคงส่งสัญญาณออกที่นั่น)

นอกจากนี้การทุ่มตลาดหลักใน SIGQUIT ขึ้นอยู่กับรายละเอียดการบริหารหลาย ulimit -c, coreadm (1M) บน Solaris ฯลฯ หมายเหตุอื่น - fg ส่งสัญญาณ SIGCONT ซึ่งทำให้กระบวนการกลับมาทำงานตามปกติ
Tadeusz A. Kadłubowski

1
  1. เพื่อดูรายการกระบวนการพื้นหลัง: jobs

    to kill: kill %1(แทนที่ 1 ด้วย id งานที่สอดคล้องกันเหมือนในjobsเอาต์พุต)

  2. ดูที่นี่

1

Ctrl-C ส่ง SIGINT ซึ่งโดยค่าเริ่มต้นทำให้กระบวนการสิ้นสุด แต่สามารถติดกับดักได้ (ใน\bin sh, ใช้trap)

SIGKILL เป็นสัญญาณการสังหารที่ไม่สามารถเอาชนะได้

แก้ไขครั้งที่สามฉันคิดว่ามันถูกต้อง: ฉันตรวจสอบทุกอย่างกับเอกสารแล้ว เราจะเห็น


SIGKILL ไม่สามารถดักจับได้

อ๋อ ฉันคงดีอยู่แล้วว่า ...
ชาร์ลส์สจ๊วต

1

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

บางโปรแกรมมีแป้นพิมพ์ลัดอื่น ๆ เพื่อออก ในvimหรือใช้vi ESC:wqในการใช้งานemacs Control-C Control-Xในnanoหรือใช้pico Control-Xโปรดทราบว่าในตัวอย่างเหล่านี้มีรายละเอียดปลีกย่อยโดยเฉพาะเกี่ยวกับว่าทางลัดเหล่านั้นบันทึกการเปลี่ยนแปลงใด ๆ ที่คุณทำกับไฟล์ที่คุณกำลังแก้ไขหรือไม่


มาตรฐานคืออะไร
Pacerier

0

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

หากต้องการบังคับให้กระบวนการเลิกคุณสามารถส่ง SIGQUIT (Ctrl- \)


SIGQUIT สามารถดักจับได้ SIGKILL ไม่สามารถเป็นได้
Charles Stewart

1
@Charles: ความแตกต่างอีกอย่างคือ SIGQUIT ทิ้งแกนโดยค่าเริ่มต้น SIGKILL ไม่ได้
Tadeusz A. Kadłubowski

0

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

โดยทั่วไปหากคุณเข้าสู่สถานการณ์นี้คุณจะต้องตรวจสอบกระบวนการทั้งหมดที่คุณใช้งานอยู่ คุณควรตรวจสอบ manpage สำหรับ ps ( man ps) ฉันชอบใช้เป็นps auxwfพิเศษซึ่งแสดงความสัมพันธ์ระหว่างผู้ปกครอง / เด็กระหว่างกระบวนการ pstreeทำสิ่งที่คล้ายกัน คุณควรรันสิ่งนี้จากเทอร์มินัลอื่นก่อนที่จะฆ่ากระบวนการเพื่อดูว่าสิ่งต่าง ๆ มีลักษณะอย่างไรในสถานการณ์ปกติและระบุกระบวนการลูก

หากคุณฆ่า (ด้วย ^ C) กระบวนการหลักนั้นให้ตรวจสอบผลลัพธ์ของ ps อีกครั้งเพื่อดูว่ามีอะไรเปลี่ยนแปลงหรือไม่ หากกระบวนการลูกยังคงอยู่รอบ ๆ คุณสามารถฆ่าพวกเขาด้วยkillคำสั่ง (ดูman kill)

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