ไฟล์มอนิเตอร์ (à la tail -f) ในไดเรกทอรีทั้งหมด (แม้แต่ไฟล์ใหม่)


53

tail -f directory/*ผมปกติดูบันทึกจำนวนมากในไดเรกทอรีทำ ปัญหาคือว่ามีการสร้างบันทึกใหม่หลังจากนั้นจะไม่แสดงในหน้าจอ (เนื่องจาก*ถูกขยายไปแล้ว)

มีวิธีตรวจสอบไฟล์ทุกไฟล์ในไดเรกทอรีหรือไม่แม้กระทั่งไฟล์ที่สร้างขึ้นหลังจากกระบวนการเริ่มทำงาน

คำตอบ:


44

คุณสามารถหาง หลายไฟล์เปิ้ลกับ ... multitail

multitail -Q 1 'directory/*'

-Q 1 PATTERNหมายถึงการตรวจสอบเนื้อหาใหม่ในไฟล์ที่มีอยู่หรือไฟล์ใหม่ที่ตรงกับPATTERNทุก 1 วินาที เส้นจากไฟล์ทั้งหมดจะแสดงในหน้าต่างเดียวกันใช้-qแทน-Qมีหน้าต่างแยกต่างหาก


10

xtailยังเป็นทางเลือก หน้าคนอธิบายมันเป็น:

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

อักขระขัดจังหวะ (โดยปกติจะเป็น CTRL / C หรือ DEL) จะแสดงรายการไฟล์ที่แก้ไขล่าสุดที่ถูกดูอยู่ ส่งสัญญาณเลิก (โดยปกติจะเป็น CTRL / แบ็กสแลช) เพื่อหยุด xtail


1
ลิงก์ใช้งานไม่ได้ แต่ฉันคิดว่าเหมือนกัน: manpages.ubuntu.com/manpages/zesty/man1/xtail.1.html
edpaez

7

ไม่มีความคิดเกี่ยวกับการแก้ปัญหาเปลือก แต่ (สมมติว่าลินุกซ์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


2

ฉันเขียนฉบับย่อที่ตอบสนองความต้องการ

#!/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

1
ที่จริงแล้วคุณสามารถหยุด sleep 1 ในลูปหลักได้เร็วกว่าเพื่อรับไฟล์ใหม่ แต่ฉันไม่ชอบการรอคอยแบบนั้น
Itamar

เนื่องจากsleepนี่ไม่ใช่การรอคอยที่ยุ่ง แต่ให้ความนุ่มนวลกับ CPU เพียงแค่ทำการสำรวจ เราสามารถเปลี่ยนเป็นsleep 0.2s(GNU sleep) หรืออะไรก็ได้ที่จะทำให้เร็วขึ้นหากต้องการ
Ned64

2

นอกจากนี้คุณสามารถดูไดเรกทอรีด้วย watch

watch -n0,1 "ls -lrt /directory/ | tail"

Minor nitpick: watchวาดใหม่หน้าจอในบัฟเฟอร์ทางเลือกด้วยบรรทัดxบรรทัดแรกจากคำสั่ง ในจำนวนไฟล์ที่ไม่มีการเปลี่ยนแปลงหากไฟล์ก่อนหน้าไม่เปลี่ยนแปลงtailอาจทำให้เกิดสิ่งเดียวกันในแต่ละครั้งดังนั้นคุณจะไม่ปรากฏรายการเพิ่มเติมเนื่องจากมีการวาดในไฟล์ 'ด้านล่าง' ด้านล่างของ จอภาพ สำหรับไฟล์สั้น แต่นี้เป็นเรื่องปกติ ...
jimbobmcgee

สิ่งนี้ไม่ได้ช่วยแก้ไขปัญหาเดิม นี่เป็นเพียงผลลัพธ์ (ไม่กี่บรรทัดสุดท้าย) ของรายการไดเรกทอรี (ซ้ำ ๆ เสมอเป็นปัจจุบัน - ขอบคุณwatch) แทนที่จะเป็นบรรทัดล่าสุดของไฟล์ทั้งหมด (รวมถึงบรรทัดใหม่) ในไดเรกทอรีนั้น
trs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.