เทอร์มินัลอีมูเลเตอร์จะฆ่าลูกของพวกเขาได้อย่างไรหลังจากได้รับ SIGKILL?


12

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

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

ฆ่าด้วย SIGKILL ทำให้ mplayer ทำงาน

$ kill -9 $pid

แต่เมื่อใช้เทอร์มินัลอีมูเลเตอร์ (xterm เทอร์มินัล ... ) เด็ก ๆ จะถูกฆ่าพร้อมกับมัน เป็นไปได้อย่างไร?

$ mplayer

และฆ่ามัน:

$ kill -9 $terminal_pid

และ mplayer ลงไปกับเรือ เทอร์มินัลอีมูเลเตอร์จับ SIGKILL หรือไม่หรือมีกำลังงานอีกอันที่นี่หรือไม่?

คำตอบ:


11

กระบวนการที่เริ่มโดยxtermจะเป็นผู้นำเซสชันในการควบคุมเครื่อง

เมื่อเทอร์มินัลหายไปกระบวนการนั้นจะรับสัญญาณ SIGHUP โดยอัตโนมัติ (ตามด้วย SIGCONT) สิ่งนี้ถูกส่งโดยเคอร์เนลในลักษณะเดียวกันกับที่กระบวนการรับ SIGINT เมื่อคุณกด CTRL-C

นอกจากนี้เชลล์อาจส่ง SIGHUP ไปยังลูก ๆ ของมันเมื่อออก (ดูdisownในบางเชลล์เพื่อปิดใช้งาน)


1
สำหรับข้อมูลเกี่ยวกับเซสชันและผู้นำเซสชัน: unix.stackexchange.com/questions/18166/… .
Kevin Cox

+1 disownซึ่งมีประโยชน์มาก
คณิตศาสตร์

1

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

ดูตัวอย่างต่อไปนี้:

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

กระบวนการทั้งหมดเหล่านี้กำลังทำงานภายใต้กระบวนการ 'xfce4-terminal' ดังนั้นถ้าฉันฆ่ากระบวนการนั้นมันจะฆ่ากระบวนการลูกทั้งหมดในกลุ่มกระบวนการโดยอัตโนมัติ ... เช่นเดียวกับที่ออกจากหน้าต่างเทอร์มินัลอีมูเลเตอร์ จำเป็นต้องทำลายการเชื่อมต่อ SSH ของฉัน

โปรแกรมเช่น shells สร้างกลุ่มกระบวนการใหม่โดยปกติแล้วจะวางกระบวนการลูกที่เกี่ยวข้องลงในกลุ่ม แต่ละงานคือกลุ่มกระบวนการ นอกเคอร์เนลเชลล์จัดการงานโดยส่งสัญญาณไปยังกลุ่มกระบวนการของงานด้วยการเรียกระบบ killpg ซึ่งส่งสัญญาณไปยังกระบวนการทั้งหมดในกลุ่มกระบวนการ


3
-1: การฆ่าผู้ปกครองไม่ได้ทำให้เด็กถูกฆ่า
camh

2
โปรแกรมเช่นเชลล์สร้างกลุ่มกระบวนการใหม่โดยปกติแล้วจะวางกระบวนการลูกที่เกี่ยวข้องลงในกลุ่ม แต่ละงานคือกลุ่มกระบวนการ นอกเคอร์เนลเชลล์จัดการงานโดยส่งสัญญาณไปยังกลุ่มกระบวนการของงานด้วยการเรียกระบบ killpg ซึ่งส่งสัญญาณไปยังกระบวนการทั้งหมดในกลุ่มกระบวนการ
Charles Boyd

2
@CharlesBoyd ความคิดเห็นนั้นควรเป็นส่วนหนึ่งของคำตอบของคุณ
จอร์แดน

4
@CharlesBoyd: เพิ่มคำตอบของคุณและฉันจะให้ +1 แทน -1 คำตอบของคุณในปัจจุบันอ่านราวกับว่ากระบวนการลูกถูกฆ่าตายเมื่อกระบวนการแม่ถูกฆ่า (BTW, ตามเซสชั่นของมันไม่ใช่กระบวนการกลุ่มตาม)
camh

@CharlesBoyd ฉันเข้าใจว่า แต่ประเด็นของคำถามคือว่า "จัดการ [] งานโดยส่งสัญญาณ" อย่างไรเมื่อได้รับ SIGKILL ฉันไม่เห็นวิธีที่จะใช้การkillpgเรียกระบบ ณ จุดนั้น
Kevin Cox

0

ประการแรกผมไม่สามารถทำซ้ำ mplayer xtermหญิงถูกฆ่าตายขั้วใช้

เหตุผลที่มันเสียชีวิตคือมันได้รับ SIGHUP จากการตายของพ่อแม่


ฉันไม่เคยพูดว่าทำอย่างนั้นฉันบอกว่ามันตาย แต่ยังมีชีวิตอยู่เมื่ออยู่ในบทและถูกฆ่าตาย
Kevin Cox

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