มีกลไกใน Unix (หรือ Linux) เพื่อหยุดการถ่ายโอนข้อมูลหลักในความคืบหน้า?


15

สมมติว่ากระบวนการขนาดใหญ่ (มาก) กำลังหยุดทำงานและทิ้งแกนประมวลผลและเรารู้สาเหตุจากข้อมูลอื่น (อาจเป็นข้อความยืนยันอาจเป็นอย่างอื่น)

มีวิธีที่จะหยุดการถ่ายโอนข้อมูลหลักจากการสร้างอย่างสมบูรณ์เพราะมันเป็นของเสียในกรณีนี้หรือไม่?

ตัวอย่างเช่นจะฆ่า -9 ของกระบวนการถ่ายโอนข้อมูลหลักขัดขวางการสร้าง corefile หรือไม่

เห็นได้ชัดว่าถ้าเรารู้ล่วงหน้าว่าเราไม่ต้องการทิ้งขยะหลักเราสามารถตั้ง ulimit ได้อย่างเหมาะสมหรือใช้ยูทิลิตี้ควบคุมไฟล์หลักต่าง ๆ ของระบบปฏิบัติการ

แต่คำถามนี้เกี่ยวกับขั้นตอน "การถ่ายโอนข้อมูลหลักที่อยู่ระหว่างดำเนินการ" ...

(ตัวอย่างเช่นลองนึกภาพฉันเป็นผู้ร้องขอใน /programming/18368242/how-to-bypass-a-2tb-core-dump-file-system-limit และไม่ต้องการเสีย 5 พื้นที่ดิสก์ขนาด -6 TB :))


บน Linux คุณสามารถปิดการใช้งานการถ่ายโอนข้อมูลหลักจากการสร้าง ... มันอาจเป็นตัวเลือกหรือไม่?
krisFR

ไม่ - การทิ้งขยะหลักเป็นสิ่งจำเป็นโดยทั่วไป แต่เราแค่มองหาวิธีที่จะหยุดมันในกรณีที่เรารู้ว่าปัญหาคืออะไรโดยไม่จำเป็นต้องใช้หลักเพื่อประหยัดเวลา / พื้นที่ดิสก์ / etc .... ของ แน่นอนว่าเราสามารถลบแกนหลักได้เมื่อเสร็จสิ้นการถ่ายโอนข้อมูล (หรือยกเลิกการเชื่อมโยงก่อนหน้านี้) แต่ไม่มีเหตุผลที่จะมัดพื้นที่ว่างสองสามกิ๊กบนดิสก์หากเราสามารถฆ่า core dump ได้ก่อนหน้านี้
Mike G.

คุณอาจใช้ "cat / dev / null> <path_to_core>" ในสคริปต์ที่เรียกใช้โปรแกรมเมื่อตรงตามเงื่อนไขที่กำหนดดังนั้นตราบใดที่รายการ / proc / <pid> อยู่ให้เข้าสู่โหมดสลีปทุกสองสามวินาทีและเรียกใช้ / คัดลอก dev / null ไปยังไฟล์หลัก มันจะทำให้มันเป็นศูนย์ ฉันไม่แน่ใจเกี่ยวกับบริบททั้งหมดของคำถาม แต่สามารถทำงานได้
Schrute

Schrute ที่จะมีผลเช่นเดียวกับการยกเลิกการเชื่อมโยงแกนกลางใช่ไหม พื้นที่ดิสก์และทรัพยากรระบบจะยังคงถูกใช้จนกว่าแกนประมวลผลจะเสร็จสิ้น - ขนาดไฟล์จะไม่ปรากฏในหน่วย du หรือ ls
Mike G.

ทรัพยากรใช่ แต่นี่เป็นวิธีการทั่วไปในการจัดการกับไฟล์ขนาดใหญ่เช่นไฟล์ core / log และไม่หยุด PID มันขึ้นอยู่กับว่าเป้าหมายคืออะไร
Schrute

คำตอบ:


8

โดยทั่วไป: ไม่ไม่มีทางที่จะฆ่า coredump ได้อย่างน่าเชื่อถือ

ที่ถูกกล่าวว่ามีความเป็นไปได้ (อย่างน้อยใน linux) เพื่อการค้า * ห้ามคงไม่มีทาง

ความเป็นไปได้อยู่ในความจริงที่ว่าซีรีย์ 3.x ของเคอร์เนลสามารถขัดจังหวะการเขียนไฟล์ ความเป็นไปได้อย่างหนึ่งคือการค้นหาเธรดที่ทำการทุ่มตลาดและส่ง SIGKILL ซ้ำไปเรื่อย ๆ จนกว่าจะสำเร็จ

นี้ชุดแพทช์แก้ไขปัญหาในระดับบาง

ความเป็นไปได้อื่น ๆ คือการใช้ไวยากรณ์ทางเลือกสำหรับ coredump_pattern คู่มือบอกว่าตั้งแต่ 2.6.19 แทนที่จะเป็นรูปแบบคุณสามารถใช้ไพพ์และโปรแกรม (พร้อม params) ที่จะจัดการดัมพ์ คุณจะสามารถควบคุมได้ว่าข้อมูลใดที่จะถูกเขียนไปยังที่ใด (/ dev / null เป็นตัวเลือกที่ชัดเจนสำหรับแกนไร้ประโยชน์ของคุณ)

แพตช์นี้สมควรได้รับความสนใจอีกเล็กน้อย: http://linux.derkeiler.com/Mailing-Lists/Kernel/2010-06/msg00918.html


ขอบคุณ zeridon - นั่นเป็นคำตอบที่ดีที่สุดแน่นอน
Mike G.

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

0

ตรวจสอบลิงค์นี้มันอาจจะมีประโยชน์

https://publib.boulder.ibm.com/httpserv/ihsdiag/coredumps.html


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Tom O'Connor

ขอบคุณ Hamed แต่ในขณะที่ลิงค์นั้นมีข้อมูลที่น่าสนใจมากมายฉันไม่คิดว่ามันจะตอบคำถามของฉัน (เว้นแต่ฉันจะพลาด - ฉันยังไม่ตื่นเลย :))
Mike G.

-1

ดูเหมือนว่าคุณสามารถเรียกใช้ ulimit -c (สมมติว่าคุณกำลังใช้ bash) เพื่อ จำกัด ขนาดดัมพ์หลัก

ดู: /ubuntu/220905/how-to-remove-limit-on-core-dump-file-size

และ

http://ss64.com/bash/ulimit.html


1
Kerry อย่างที่ฉันพูดใน OP ว่า "แน่นอนถ้าเรารู้ล่วงหน้าว่าเราไม่ต้องการทิ้งขยะหลักเราสามารถตั้ง ulimit ให้เหมาะสมหรือใช้ยูทิลิตี้ควบคุมไฟล์หลักต่าง ๆ ของระบบปฏิบัติการ" ฉันกำลังพยายามที่จะดูว่ามีวิธีที่จะหยุดการถ่ายโอนข้อมูลหลักเมื่อมันเริ่มขึ้นแล้วสำหรับงานที่มีขนาดใหญ่มาก (เพื่อประหยัดเวลา / พื้นที่ดิสก์ / ทรัพยากร)
Mike G.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.