ฉันอ่าน man core และ man date page และหน้าเว็บคุณภาพสี่หน้าในหัวข้อ core dumps ฉันศึกษาและฝึกทำคอร์ดัมพ์มาสี่วันแล้ว
คำถามระบุไว้อย่างดีในชื่อของโพสต์นี้
หมายเหตุ: เมื่อฉันอ้างถึง 'core' ฉันยังอ้างถึงพารามิเตอร์เคอร์เนล kernel.core_pattern และจะเรียกมันว่าตัวแปรสภาพแวดล้อม ฉันเรียกมันว่าตัวแปรสภาพแวดล้อมเพราะมันทำหน้าที่เหมือนตัวแปรสภาพแวดล้อมในขอบเขตส่วนกลาง ฉันใช้คำเหล่านี้แทนกันได้
core อธิบายใน man page วิธีตั้งค่าสภาพแวดล้อมนี้ให้แปรปรวน
จับคู่เทมเพลต เทมเพลตมี 'ตัวระบุเวลา' %t
ที่ให้
ไปยังเทมเพลตเวลาปัจจุบันในรูปแบบยูนิกซ์ วินาทีตั้งแต่ยุค
ตามหลักเกณฑ์หลัก สคริปต์ต่อไปนี้เป็นเทมเพลตที่เกี่ยวข้อง:
แกน.%e.%t
%e เป็นชื่อไฟล์ปฏิบัติการ
%t คือเวลาของการถ่ายโอนข้อมูล ซึ่งแสดงเป็นวินาทีตั้งแต่ยุคนั้น
core คือชื่อไฟล์ อาจเป็นแกนหลักหรือชื่อใดก็ได้ที่คุณตั้งให้
หมายเหตุ: อาจมีเส้นทางที่นำไปสู่ตำแหน่งที่คุณต้องการวางไฟล์ แต่ฉันจะเขียนไปยังไดเร็กทอรีการทำงานปัจจุบัน และฉันจะทำให้การอ่านสคริปต์ที่นี่เป็นเรื่องง่าย ดังนั้นฉันจึงข้ามเส้นทางนี้ไป
เราสามารถตั้งค่าตัวแปรสภาพแวดล้อมได้ดังนี้
sudo sysctl -w kernel.core_pattern=core.%e.%t
ตอนนี้ฉันต้องการวันที่ในรูปแบบสองหลัก ปีสองหลัก เดือนสองหลัก เช่น 220224ปัญหาคือตัวระบุเวลา %t
ของแกนให้เวลาเป็นวินาทีตั้งแต่ยุคไม่เป็นมิตรกับมนุษย์!
ฉันยังกำหนดให้วันที่เป็นวันที่ล่าสุดเมื่อมีการเรียกใช้สคริปต์ ตัวระบุเวลา %t
แกนหลักจะทำเช่นนี้ แต่,
ผลลัพธ์คือชื่อไฟล์อ่านด้วยการประทับเวลายูนิกซ์ซึ่งไม่เป็นมิตรกับมนุษย์!
ในทางกลับกัน หากฉันแทนที่สคริปต์ในตำแหน่งของตัวระบุเวลาของคอร์ในขณะที่ตั้งค่าตัวแปรสภาพแวดล้อม kernel.core_pattern ดังนั้นเทมเพลตการตั้งชื่อคอร์จะถูกเขียนด้วยวันที่ที่เขียนไว้ ณ เวลาที่สร้างเทมเพลต ไม่ใช่เวลาจริงของคอร์ การถ่ายโอนข้อมูล
สคริปต์ที่ฉันวางแผนจะทำต่อไปนี้ ฉันเพิ่งแทนที่ตัวระบุเวลาหลักในเทมเพลตด้วยตัวอย่างที่ให้ไว้ที่นี่:
วันที่ -d "-8 ชั่วโมง" +%y%m%d
แต่โปรดจำไว้ว่าหากฉันใช้สคริปต์แทนตัวระบุเวลาของคอร์ เวลาที่กำหนดในเทมเพลตจะกลายเป็นฮาร์ดโค้ดและจะไม่ถูกต้องในครั้งต่อไปที่ฉันต้องดึงคอร์ดัมพ์
สคริปต์ของฉันมีลักษณะดังนี้:
sudo sysctl -w kernel.core_pattern=core.%e.`date -d "-8 hours" +%y%m%d`; ~/test.out
เดอะ ~/test.out
ส่วนหนึ่งของสคริปต์นั้นเรียกใช้ไฟล์ทดสอบที่ฉันใช้เพื่อเรียนรู้วิธีแก้ปัญหาการติดตั้ง linux
สคริปต์ของฉันตั้งค่าตัวแปรสภาพแวดล้อมก่อนที่จะเรียกสคริปต์ทดสอบ ประโยชน์ของสิ่งนี้คือไฟล์ core-dump ได้รับการตั้งชื่อตามสคริปต์การทดสอบที่เรียก และสิ่งนี้ทำให้ไฟล์ core-dump มีชื่อที่มีความหมาย
สคริปต์ของฉันใช้งานได้ ถึงกระนั้น ทุกครั้งที่ฉันต้องการดึงคอร์ดัมพ์ ฉันต้องไม่ลืมที่จะติดตามการเรียกไปยังสคริปต์การทดสอบพร้อมกับสคริปต์ของฉัน หากฉันไม่ได้รวมการกำหนดให้กับตัวแปรสภาพแวดล้อมเข้ากับการเรียกใช้สคริปต์การทดสอบ วันที่ที่เขียนลงในไฟล์คอร์ดัมพ์จะกลายเป็นอะไรก็ตามที่ตั้งค่าเป็นครั้งสุดท้ายที่มีการตั้งค่าการกำหนดให้กับตัวแปรสภาพแวดล้อม ซึ่งไม่ถูกต้องมากนัก
ฉันต้องการเขียนสคริปต์ใหม่เพื่อให้เขียนวันที่ได้ดีที่สุดในรูปแบบที่มนุษย์อ่านได้ รวมถึงวันที่ที่เขียนในเวลาที่คอร์ดัมพ์เกิดขึ้น ฉันเหนื่อย!
ปัญหาหนึ่งที่ฉันพบเกิดขึ้นเนื่องจากคำสั่ง date ใช้โทเค็นการควบคุมรูปแบบเดียวกัน %t
เช่นเดียวกับโทเค็นตัวระบุเทมเพลตหลัก %t
นี่คือการทดสอบเพื่อยืนยันความขัดแย้งของตัวระบุเวลาหลักและการควบคุมรูปแบบของคำสั่งวันที่:
โทเค็นนี้หมายถึงมาจากตัวระบุเวลาหลัก
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@%t +%y%m%d`; ~/test.out
สิ่งนี้ให้ข้อความ "วันที่: วันที่ไม่ถูกต้อง â@%tâ"
คุณเห็นไหมว่าเราไม่สามารถวางตัวระบุเวลาหลักในตำแหน่งเวลาของสคริปต์วันที่ได้
นี่คือการทดสอบเพื่อยืนยันว่าสคริปต์ใช้งานได้เมื่อใช้งานตามที่ต้องการ:
นี่คือการประทับเวลา Unix epoch
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@1645337785 +%y%m%d`; ~/test.out
สิ่งนี้ทำงานได้ตามที่คาดไว้ยกเว้นวันที่คงที่
คุณเห็นหรือไม่ว่าการประทับเวลายูนิกซ์สามารถแทนที่ตำแหน่งเวลาของสคริปต์วันที่ได้จริง
อาจมีวิธีอื่นในการทำเช่นนี้ แต่ฉันไม่รู้. ฉันกำลังถามว่ามีท่านใดเห็นวิธีแก้ปัญหานี้หรือไม่
ขอบคุณสำหรับเวลาของคุณล่วงหน้า