tail -f directory/*
ผมปกติดูบันทึกจำนวนมากในไดเรกทอรีทำ ปัญหาคือว่ามีการสร้างบันทึกใหม่หลังจากนั้นจะไม่แสดงในหน้าจอ (เนื่องจาก*
ถูกขยายไปแล้ว)
มีวิธีตรวจสอบไฟล์ทุกไฟล์ในไดเรกทอรีหรือไม่แม้กระทั่งไฟล์ที่สร้างขึ้นหลังจากกระบวนการเริ่มทำงาน
tail -f directory/*
ผมปกติดูบันทึกจำนวนมากในไดเรกทอรีทำ ปัญหาคือว่ามีการสร้างบันทึกใหม่หลังจากนั้นจะไม่แสดงในหน้าจอ (เนื่องจาก*
ถูกขยายไปแล้ว)
มีวิธีตรวจสอบไฟล์ทุกไฟล์ในไดเรกทอรีหรือไม่แม้กระทั่งไฟล์ที่สร้างขึ้นหลังจากกระบวนการเริ่มทำงาน
คำตอบ:
xtail
ยังเป็นทางเลือก หน้าคนอธิบายมันเป็น:
Xtail มอนิเตอร์หนึ่งไฟล์ขึ้นไปและแสดงข้อมูลทั้งหมดที่เขียนไปยังไฟล์ตั้งแต่การเรียกใช้คำสั่ง มันมีประโยชน์มากสำหรับการตรวจสอบ logfiles หลายรายการพร้อมกัน หากรายการที่กำหนดในบรรทัดคำสั่งเป็นไดเรกทอรีไฟล์ทั้งหมดในไดเรกทอรีนั้นจะถูกตรวจสอบรวมถึงรายการที่สร้างขึ้นหลังจากการเรียกใช้ xtail หากไม่มีรายการที่ระบุในบรรทัดคำสั่ง xtail จะคอยดูและตรวจสอบเมื่อสร้างขึ้น เมื่อสลับไฟล์ในจอแสดงผลแบนเนอร์ที่แสดงชื่อพา ธ ของไฟล์จะถูกพิมพ์
อักขระขัดจังหวะ (โดยปกติจะเป็น CTRL / C หรือ DEL) จะแสดงรายการไฟล์ที่แก้ไขล่าสุดที่ถูกดูอยู่ ส่งสัญญาณเลิก (โดยปกติจะเป็น CTRL / แบ็กสแลช) เพื่อหยุด xtail
ไม่มีความคิดเกี่ยวกับการแก้ปัญหาเปลือก แต่ (สมมติว่าลินุกซ์1
) inotify
อาจจะเป็นวิธีที่จะไป ... ดูตัวอย่างนี้เลียนแบบtail -F
(ใช้pyinotify
) บางทีมันอาจจะสามารถนำมาใช้เป็นพื้นฐานสำหรับการดังต่อไปนี้สารบบทั้งหมด
โดยทั่วไปinotify
สามารถตรวจสอบไดเรกทอรี (อ้างอิงman 7 inotify
)
บิตต่อไปนี้สามารถระบุได้ในรูปแบบมาสก์เมื่อเรียก inotify_add_watch (2) และอาจถูกส่งคืนในฟิลด์รูปแบบที่ถูกส่งคืนโดย read (2):
IN_ACCESS File was accessed (read) (*). IN_ATTRIB Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*). IN_CLOSE_WRITE File opened for writing was closed (*). IN_CLOSE_NOWRITE File not opened for writing was closed (*). IN_CREATE File/directory created in watched directory (*). IN_DELETE File/directory deleted from watched directory (*). IN_DELETE_SELF Watched file/directory was itself deleted. IN_MODIFY File was modified (*). IN_MOVE_SELF Watched file/directory was itself moved. IN_MOVED_FROM File moved out of watched directory (*). IN_MOVED_TO File moved into watched directory (*). IN_OPEN File was opened (*).
เมื่อมอนิเตอร์ไดเร็กทอรีเหตุการณ์ที่ทำเครื่องหมายด้วยเครื่องหมายดอกจัน (*) ด้านบนสามารถเกิดขึ้นกับไฟล์ในไดเร็กทอรีซึ่งในกรณีนี้ฟิลด์ชื่อในโครงสร้าง inotify_event ที่ส่งคืนจะระบุชื่อของไฟล์ภายในไดเร็กทอรี
(... และpyinotify
ติดตามตัวเลือกเหล่านี้อย่างใกล้ชิด)
1
: BSD มีสิ่งที่คล้ายกัน, kqueue
. อาจจะเป็นทางออกที่ข้ามแพลตฟอร์มจะทำได้โดยใช้ GIO ( ผูกงูใหญ่ ) เป็นชั้นที่เป็นนามธรรมเพราะมันสามารถข้างinotify
, ยังใช้kqueue
ฉันเขียนฉบับย่อที่ตอบสนองความต้องการ
#!/bin/bash
LOG_PATTERN=$1
BASE_DIR=$(dirname $LOG_PATTERN* | head -1)
run_thread (){
echo Running thread
tail -F $LOG_PATTERN* &
THREAD_PID=$!
}
# When someone decides to stop the script - killall children
cleanup () {
pgrep -P $$ | xargs -i kill {}
exit
}
trap cleanup SIGHUP SIGINT SIGTERM
if [ $# -ne 1 ]; then
echo "usage: $0 <directory/pattern without * in the end>"
exit 1
fi
# Wait for the directory to be created
if [ ! -d $BASE_DIR ] ; then
echo DIR $BASE_DIR does not exist, waiting for it...
while [ ! -d $BASE_DIR ] ; do
sleep 2
done
echo DIR $BASE_DIR is now online
fi
# count current number of files
OLD_NUM_OF_FILES=$(ls -l $LOG_PATTERN* 2>/dev/null | wc -l)
# Start Tailing
run_thread
while [ 1 ]; do
# If files are added - retail
NUM_FILES=$(ls -l $LOG_PATTERN* 2>/dev/null | wc -l)
if [ $NUM_FILES -ne $OLD_NUM_OF_FILES ]; then
OLD_NUM_OF_FILES=$NUM_FILES
kill $THREAD_PID
run_thread
fi
sleep 1
done
sleep
นี่ไม่ใช่การรอคอยที่ยุ่ง แต่ให้ความนุ่มนวลกับ CPU เพียงแค่ทำการสำรวจ เราสามารถเปลี่ยนเป็นsleep 0.2s
(GNU sleep) หรืออะไรก็ได้ที่จะทำให้เร็วขึ้นหากต้องการ
นอกจากนี้คุณสามารถดูไดเรกทอรีด้วย watch
watch -n0,1 "ls -lrt /directory/ | tail"
watch
วาดใหม่หน้าจอในบัฟเฟอร์ทางเลือกด้วยบรรทัดxบรรทัดแรกจากคำสั่ง ในจำนวนไฟล์ที่ไม่มีการเปลี่ยนแปลงหากไฟล์ก่อนหน้าไม่เปลี่ยนแปลงtail
อาจทำให้เกิดสิ่งเดียวกันในแต่ละครั้งดังนั้นคุณจะไม่ปรากฏรายการเพิ่มเติมเนื่องจากมีการวาดในไฟล์ 'ด้านล่าง' ด้านล่างของ จอภาพ สำหรับไฟล์สั้น แต่นี้เป็นเรื่องปกติ ...
watch
) แทนที่จะเป็นบรรทัดล่าสุดของไฟล์ทั้งหมด (รวมถึงบรรทัดใหม่) ในไดเรกทอรีนั้น