วิธีการหมุนไฟล์ nohup.out โดยไม่ฆ่าแอปพลิเคชันของฉัน


10

nohup.outไฟล์ของฉันเติบโตอย่างรวดเร็ว

ฉันกำลังเรียกใช้แอปพลิเคชั่นอยู่เบื้องหลังมันกำลังเขียนnohup.outไฟล์

ตอนนี้ฉันต้องหมุนnohup.outไฟล์โดยไม่ฆ่าแอปพลิเคชันของฉัน สามารถทำได้หรือไม่


คัดลอกแล้วตัดทอน
เจนนี่ D

เขาอาจสูญเสียรายการบันทึกที่มีค่าระหว่างการดำเนินการสองอย่างที่คุณแนะนำ ฉันจะไม่แนะนำที่นี่
Cleankod

คำตอบ:


6

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

flog (ตัวบันทึกไฟล์) เป็นโปรแกรมที่อ่านอินพุตจาก STDIN และเขียนลงไฟล์

หากได้รับ SIGHUP ไฟล์จะถูกเปิดอีกครั้งเพื่อให้สามารถหมุนบันทึกได้ [ดู logrotate (8) บน RH]

ไฟล์บันทึกจะเปิดขึ้นมาใหม่หาก flog ตรวจพบว่ามีการหมุนเกิดขึ้น (เช่นไฟล์เก่าหายไปหรือเปลี่ยน inode) flog มีขนาดเล็กมาก (น้อยกว่า 500 ไบต์หน่วยความจำ)


nohup สามารถใช้ไพพ์แทน nohup.out ได้หรือไม่
Brian Minton

1
คุณสามารถใช้การเปลี่ยนเส้นทางไฟล์ (>) เพื่อส่งออกไปยังไฟล์อื่นที่ไม่ใช่ nohup.out ตาม man page:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

คุณไม่สามารถหมุนได้ คุณสามารถตัดมันด้วยคำสั่ง>nohup.outซึ่งจะลบเนื้อหาทั้งหมดในไฟล์

คุณสามารถคัดลอกไฟล์ก่อนแล้วจึงตัดมันถ้าคุณต้องการบันทึกผลลัพธ์ แต่มีหน้าต่างเล็ก ๆ สำหรับการแข่งขันซึ่งสามารถเขียนเอาต์พุตได้หลังจากที่คุณคัดลอกไฟล์ แต่ก่อนที่คุณจะตัดทอน เอาต์พุตใด ๆ ที่เขียนระหว่างหน้าต่างนั้นจะหายไปตลอดกาล


1
ฉันเชื่อว่าการตัดทอนจะไม่เพิ่มพื้นที่ว่างบนดิสก์จนกว่าตัวจัดการไฟล์จะถูกปิด
symcbean

@symcbean ความเชื่อของคุณไม่ถูกต้อง การตัดทอนไฟล์ทำให้พื้นที่ว่างเพิ่มขึ้นทันที
kasperd

การคัดลอกการตัดทอน Logrotate ควรทำเคล็ดลับ
user9517

@Iain ขั้นตอนที่ผมอธิบายเทียบเท่ากับในcopytruncate logrotateแต่nohup.outไม่ค่อยเป็นชนิดของไฟล์ที่คุณจะกำหนดค่างาน cron ให้หมุน
kasperd

2

คุณทำไม่ได้

คุณสามารถยกเลิกการเชื่อมโยงไฟล์ (rm) แต่ข้อมูลยังคงมีรอยบนดิสก์และจะถูกเขียนต่อไปตราบใดที่มีการจัดการไฟล์ที่เปิดอยู่

คุณสามารถเปลี่ยนชื่อไฟล์ได้ - แต่ก็ไม่ได้เป็นการหยุดเขียน (แต่ถ้าคุณเริ่มงานแบ็คกราวน์เป็นประจำงานใหม่จะเขียนเป็นไฟล์เดียวกัน)

คุณควรเปลี่ยนเส้นทางงานไปยังสิ่งที่ออกแบบมาเพื่อจัดการสิ่งนี้อย่างชัดเจน (เช่นapache rotatelogs )


ลอกเลียนแบบตัดทอนทุกคนหรือไม่
user9517

นั่นขึ้นอยู่กับว่า nohup ผนวกกับ nohup.out ทีละบรรทัดหรือว่าจะรักษาตัวชี้ไปยังตำแหน่งของ nohup.out ดูserverfault.com/questions/221337/…สำหรับตัวอย่าง
pepoluan

2

ไม่แน่ใจว่าฉันสายเกินไปหรือไม่ แต่สำหรับคนอื่น ๆ ที่สะดุดกับฟอรัมนี้ตอนนี้ฉันไม่ต้องลองอะไรกับโบยหรืออะไรเลย

งานของฉันเริ่มต้นง่ายๆเช่นนี้:

nohup <my process> &

นี่เป็นการเริ่มงานของฉันและเริ่มผนวกท้าย nohup.out ในไดเรกทอรีนั้น

สิ่งที่ฉันต้องทำคือติดตั้ง logrotate ซึ่งมักจะมาพร้อมกับ distro และกำหนดค่าบางอย่างเช่นนี้ /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

และมันก็ใช้งานได้ !! nohup.out กำลังถูกตัดทอนในขณะที่รับผนวกใหม่ในไฟล์เดียวกัน กระบวนการก็ไม่ได้ตายเช่นกัน และ nohup ใหม่แบบใหม่nohup.out-20190528นี้ถูกสร้างขึ้น

หวังว่านี่จะช่วยได้


1

Logrotate มีตัวเลือก copytruncate ซึ่งจะตัดทอน (ว่าง) ไฟล์ที่คุณระบุหลังจากที่มันถูกคัดลอกไปยังรูปแบบการหมุนปกติ (และการบีบอัดหากมีการตั้งค่า)

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

จากmanpage logrotate


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