วิธีตรวจสอบขีด จำกัด ใดเกิน (กระบวนการถูกยกเลิกเนื่องจาก ulimit)


11

สมมติว่ากระบวนการทำงานในสภาพแวดล้อมที่มีตัวคั่น:

(
ulimit  ... -v ... -t ... -x 0 ...
./program
)

โปรแกรมถูกยกเลิก

อาจมีสาเหตุหลายประการ: เกินขีด จำกัด หน่วยความจำ / เวลา / ไฟล์; segfault ง่าย ๆ หรือการเลิกจ้างปกติด้วยรหัสส่งคืน 0

จะตรวจสอบสาเหตุของการยกเลิกโปรแกรมได้อย่างไรโดยไม่ต้องแก้ไขโปรแกรม

PS ฉันหมายถึง "เมื่อได้รับไบนารี" บางทีเสื้อคลุม (ptrace-ing ฯลฯ ) อาจช่วยได้บ้าง?

คำตอบ:


6

โดยทั่วไปแล้วฉันไม่คิดว่าคุณจะโชคร้าย (ระบบปฏิบัติการบางระบบอาจมีให้ แต่ฉันไม่ทราบถึงสิ่งที่ฉันรู้ว่าสนับสนุน)

เอกสารอ้างอิงสำหรับข้อ จำกัด ทรัพยากร: getrlimitจาก POSIX 2008

RLIMIT_CPUใช้ตัวอย่างเช่นขีด จำกัด ของ CPU

  • หากกระบวนการเกินขีด จำกัด ซอฟท์แวร์นั้นจะถูกส่งไป SIGXCPU
  • หากกระบวนการเกินขีด จำกัด ฮาร์ดจะได้รับธรรมดา SIGKILL

หากคุณสามารถเกี่ยวกับโปรแกรมของคุณคุณสามารถบอกได้ว่ามันถูกฆ่าตายโดยwait() SIGXCPUแต่คุณไม่สามารถแยกแยะความแตกต่างที่SIGKILLถูกส่งไปเพื่อฝ่าฝืนข้อ จำกัด อย่างหนักจากการฆ่าแบบธรรมดาจากภายนอก ยิ่งไปกว่านั้นหากโปรแกรมจัดการกับXCPUคุณจะไม่เห็นเลยว่าจากภายนอก

RLIMIT_FSIZEสิ่งเดียวกันสำหรับ คุณสามารถดูSIGXFSZจากwait()สถานะหากโปรแกรมไม่จัดการ แต่เมื่อเกินขีด จำกัด ขนาดไฟล์สิ่งเดียวที่เกิดขึ้นคือ I / O เพิ่มเติมที่พยายามทดสอบขีด จำกัด นั้นอีกครั้งจะได้รับเพียงอย่างEFBIGเดียว - สิ่งนี้จะได้รับการจัดการ (หรือไม่น่าเสียดาย) โดยโปรแกรมภายใน หากโปรแกรมจัดการSIGXFSZเช่นเดียวกับด้านบน - คุณจะไม่รู้เกี่ยวกับมัน

RLIMIT_NOFILE? คุณไม่ได้รับสัญญาณด้วยซ้ำ openและเพื่อน ๆ ก็กลับEMFILEไปที่โปรแกรม มันไม่ได้ใส่ใจเป็นอย่างอื่นดังนั้นมันจะล้มเหลว (หรือไม่) ไม่ว่าด้วยวิธีใดก็ตามที่มีการกำหนดให้ล้มเหลวในสถานการณ์นั้น

RLIMIT_STACK? ดีมากSIGSEGVไม่สามารถแยกความแตกต่างจากคะแนนของเหตุผลอื่นเพื่อให้ได้รับมอบ (คุณจะรู้ว่านั่นคือสิ่งที่ฆ่ากระบวนการแม้ว่าจากwaitสถานะ)

RLIMIT_ASและRLIMIT_DATAจะทำmalloc()และคนอื่น ๆ จะเริ่มล้มเหลว (หรือรับSIGSEGVถ้าขีด จำกัด AS ถูกกระทบในขณะที่พยายามขยายสแต็กบน Linux) ถ้าโปรแกรมนั้นเขียนได้ดีมากมันอาจจะล้มเหลวแบบสุ่มพอสมควร ณ จุดนั้น

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

สิ่งที่ดีที่สุดที่คุณสามารถทำได้เท่าที่ฉันรู้ก็คือเขียนโค้ดที่ใช้ในโปรแกรมของคุณรออยู่และ:

  • ตรวจสอบสถานะการออกเพื่อตรวจจับSIGXCPUและSIGXFSZ(AFAIK สัญญาณเหล่านั้นจะถูกสร้างขึ้นโดยระบบปฏิบัติการสำหรับปัญหาการ จำกัด ทรัพยากร) ขึ้นอยู่กับความต้องการที่แน่นอนของคุณคุณสามารถสันนิษฐานได้SIGKILLและSIGSEGVเกี่ยวข้องกับข้อ จำกัด ของทรัพยากร แต่นั่นก็เป็นเรื่องเล็กน้อย
  • ดูสิ่งที่คุณสามารถทำได้จากgetrusage(RUSAGE_CHILDREN,...)การนำไปใช้ของคุณเพื่อรับคำแนะนำเกี่ยวกับสิ่งอื่น

สิ่งอำนวยความสะดวกเฉพาะสำหรับ OS อาจมีอยู่เพื่อช่วยเหลือที่นี่ (อาจเป็นเช่นptraceLinux หรือ Solaris dtrace) หรืออาจเป็นเทคนิคการดีบั๊กชนิดหนึ่ง


(ฉันหวังว่าคนอื่นจะตอบด้วยเวทมนตร์บางอย่างที่ฉันไม่รู้)


ตกลง. สิ่งที่เกี่ยวกับข้อสาม: (Mem) เกินขีด จำกัด หน่วยความจำ, เวลา (จำกัด ), ข้อผิดพลาดอื่น (Err)? ฉันรู้เกี่ยวกับการทำเสื้อคลุมรอบ ๆmallocแต่น่าเสียดายที่มันไม่ได้แก้ปัญหาหน่วยความจำโดยทั่วไปทำให้เกิดโดยทั่วไปเกี่ยวกับการโทรของระบบbrk(ฉันใช่ไหม?)
Grzegorz Wierzowiecki

1
การห่อ malloc จะไม่ช่วยถ้าคุณไม่ควบคุมโปรแกรม หากคุณกำลังพูดคุยเกี่ยวกับการแฮ็กเช่นLD_PRELOADไอเอ็นจีว่าเส้นเขตแดนของคุณ "ไม่ได้ปรับเปลี่ยนกระบวนการ" ข้อ จำกัด และมันจะช่วยเล็กน้อย แต่ไม่ได้จริงๆ - malloc, brk, sbrkและmmapจะล้มเหลวด้วยENOMEMตรงเช่นถ้าคุณเป็นจริงในสถานการณ์ที่หน่วยความจำต่ำ (แต่ต่ำกว่าขีด จำกัด หน่วยความจำ) กำหนดเวลาคือRLIMIT_CPUฉันไม่รู้เวลา จำกัด ของนาฬิกาแขวน
Mat

brkขอขอบคุณสำหรับการสร้างความมั่นใจเกี่ยวกับฉัน ตามที่ฉันเห็นความต้องการ 'โปรแกรมไม่ได้จัดการสัญญาณ X, Y, Z ... ' จะแก้ปัญหาของ SIGXCPU, SIGXFSZ, SIGSEGV ขอบคุณ waitpid (ถ้าฉันผิดโปรดแก้ไขฉันด้วย)
Grzegorz Wierzowiecki

1
SIGSEGV สามารถยกขึ้นในสถานการณ์ที่ไม่ละเมิดข้อ จำกัด ของทรัพยากร (ตัวชี้โมฆะ null เป็นสิ่งที่พบบ่อยที่สุดที่ยกมัน) - คุณไม่สามารถแน่ใจได้ว่ามันเป็น ulimit hit ที่ทำให้เกิด
Mat

brkขอขอบคุณสำหรับการสร้างความมั่นใจเกี่ยวกับฉัน อย่างที่ฉันเห็นความต้องการ 'โปรแกรมไม่ได้จัดการสัญญาณ X, Y, Z ... ' จะแก้ปัญหาของ SIGXCPU, SIGXFSZ, SIGSEGV ขอบคุณ waitpid ฉันถูกไหม?
Grzegorz Wierzowiecki

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