ซอมบี้ในทุบตี


11

Bash ดูเหมือนจะไม่สร้างซอมบี้ ดูเหมือนว่ากระบวนการจะเก็บเกี่ยวได้ทันทีเมื่อถูกฆ่า

ฉันสามารถทุบตีทำให้ซอมบี้ได้หรือไม่?


ทำไมฉันถาม:

ฉันต้องการที่จะสามารถฆ่ากระบวนการของเด็กได้อย่างปลอดภัยหรือปลอดภัยkill -9หากไม่ได้ตายภายในระยะเวลาหนึ่ง แต่ฉันไม่ต้องการเผลอทำกระบวนการที่ไม่ใช่กระบวนการลูกของฉันโดยไม่ตั้งใจ กระบวนการซอมบี้มักจะทำให้ง่ายและปลอดภัยต่อสภาพการแข่งขัน


1
อาจเป็นความคิดอื่น ... หากคุณต้องการปกป้องจากการฆ่ากระบวนการภายนอกให้ตรวจสอบกลุ่ม cg เรียกใช้unshareเพื่อสร้างเนมสเปซ PID จากภายในทรีกระบวนการนั้นกระบวนการภายนอกจะถูกแยกออกและไม่สามารถเข้าถึงได้
orion

ใช้การควบคุมงาน (เช่นเดียวกับkill -KILL %nที่nมีหมายเลขงานและอื่น ๆ ) แทนที่จะพยายามหลีกเลี่ยง
สัตว์ที่กำหนด

เป็นคำถามที่ดีมาก! วิธีอื่นในการ "ทำไมคุณถาม" แม้ว่า: คุณเคยพิจารณาtimeoutคำสั่งหรือไม่
Wildcard

คำตอบ:


13

วิธีสร้างกระบวนการซอมบี้:

$ (sleep 1 & exec /bin/sleep 10)

สิ่งนี้จะแทนที่เชลล์ที่ทำงานsleep 1ด้วย/bin/sleep 10ซึ่งจะไม่ทราบว่าsleep 1กระบวนการสิ้นสุดแล้วดังนั้นสร้างซอมบี้เป็นเวลา 10 วินาที


ฉันไม่แน่ใจว่าคุณคาดหวังอะไรจากการฆ่ากระบวนการซอมบี้ กระบวนการซอมบี้ตายไปแล้วคุณไม่สามารถฆ่ามันได้

ที่จริงแล้วคุณสามารถทำให้กระบวนการซอมบี้หายไป แต่โดยการฆ่าผู้ปกครองไม่ใช่กระบวนการของซอมบี้เอง


PID ที่ได้รับการ Readed จะได้รับการรีไซเคิล ประเด็นของซอมบี้ก็คือพวกเขาสงวน PIDs ไว้จนกว่าผู้ปกครองจะยอมรับการตายของลูกของมันโดยรออยู่ หากปราศจากสิ่งนี้การฆ่า pid อาจส่งผลให้เหยื่อประสบอุบัติเหตุ
PSkocik

1
ใน C คุณสามารถมั่นใจได้ว่าคุณจะไม่ตกเป็นเหยื่อของอุบัติเหตุเมื่อคุณฆ่าลูกของคุณเพราะจนกว่าคุณจะรอเด็กคนนั้น PID ของเด็กคนนั้นจะไม่สามารถรีไซเคิลได้ ฉันต้องการที่จะได้รับการรับประกันเดียวกันในเปลือก
PSkocik

3

ไม่ใช่คำตอบที่น่าสนใจ:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

นี่เป็นกระบวนการซอมบี้อย่างไร? มันเพิ่งหยุด นอกจากนี้ยัง$BASHPIDเป็น$$ฉันคิดว่า
Gabor Csardi

$BASHPID คือไม่ได้$$เหมือนกันว่า ลองรหัสต่อไปนี้: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). คุณสามารถค้นหาข้อมูลเพิ่มเติมman bashได้ที่
Alex Baranowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.