ฆ่ากระบวนการที่ถูกระงับหรือไม่


17

ฉันสับสนเล็กน้อยโดย:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

ดังนั้นฉันจึงลาออกเพื่อ "ทำเอง" และสงสัยว่าทำไมในภายหลัง:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

Oh!

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

แต่เห็นได้ชัดว่าไม่ใช่สิ่งที่ฉันตั้งใจ

มีวิธี "ปลุกและออก" ในคำสั่งเดียวหรือไม่ เช่นนามแฝงในตัวkill %N && fg %Nใช่หรือไม่

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

คำตอบ:


20

vi-vi-viเป็นของปีศาจ คุณต้องฆ่ามันด้วยไฟ หรือSIGKILL:

kill -KILL %1

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


1
ทำไมคุณถึงต้องใช้ SIGABRT มันหมายถึงการระบุข้อผิดพลาดของโปรแกรม SIGKILL อยู่ที่นี่ตั้งแต่คุณต้องการที่จะฆ่าโปรแกรมตอนนี้ไม่ว่ามันจะต้องการหรือไม่
Gilles 'หยุดความชั่วร้าย' ใน

1
ที่จริงแล้วดูเหมือนว่าจะทำให้SIGTERMกระบวนการนอนหลับตอนนี้อย่างน้อยถ้าพวกเขาไม่มีตัวจัดการสำหรับมัน ฉันคิดว่ามันไม่ได้ใช้ในการทำงานด้วยวิธีนี้เพราะฉันจำได้ว่าต้องมีbgหรือfgอะไรบางอย่างก่อนที่มันจะได้รับสัญญาณและหายไป แต่ผมทดสอบด้วยawk 'BEGIN{while(42){}}' &และstrace kill $!และมีเพียงหนึ่งสายระบบด้วยkill(2) SIGTERM
Peter Cordes

6

vimกำลังติดตั้งตัวจัดการสัญญาณ (และอาจเป็นการตั้งค่าsigprocmask(2)) เพื่อละเว้นสัญญาณทั่วไปเพื่อให้ไฟล์ใด ๆ ที่ถูกแก้ไขจะไม่สูญหายเนื่องจากการควบคุมหลงทาง + c หรือสัญญาณการฆ่าแบบสุ่ม โปรแกรมที่ง่ายกว่านั้นถูกฆ่าได้ง่าย:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

การvimออก (อย่างปลอดภัย) จะต้องใช้ตัวจัดการสัญญาณในการvimยอมรับTERMหรือUSR1สิ่งที่บันทึก (หรือทิ้ง?) บัฟเฟอร์ใด ๆ ฯลฯ คุณพยายามทำอะไรเพื่อให้vimออกจากสิ่งนี้


"คุณกำลังพยายามทำอะไรเพื่อให้เป็นกลุ่มแบบนี้?" - ไม่มีอะไรมันเป็นไฟล์ "tmp" อย่างแท้จริงที่ฉันแก้ไข vimเป็นเพียงตัวเลือกที่ไม่เข้าใจของโปรแกรมในการทดสอบช่วงล่าง
OJFord

1
"ไม่สนใจสัญญาณทั่วไปดังนั้นไฟล์ใด ๆ ที่ถูกแก้ไขจะไม่สูญหายเนื่องจากการควบคุมหลงทาง + c หรือสัญญาณการฆ่าแบบสุ่ม" - แต่ทันทีที่ฉันfgออกจากมันมันจะหยุดเพียงตราบเท่าที่มันถูกระงับ?
OJFord

2
@OllieFord: SIGKILLตื่นขึ้นมาเพียงกระบวนการนอนหลับเพื่อให้สามารถตาย การส่งสัญญาณไปยังกระบวนการที่ถูกระงับซึ่งมีตัวจัดการที่กำหนดเองสำหรับพวกเขาไม่ได้ปลุก (นอกจากSIGCONTสัญญาณแน่นอนแล้ว bgและfgส่งSIGCONT)
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.