একটি সম্পূর্ণ ডিরেক্টরিতে ফাইলগুলি (à লা টেইল -f) নিরীক্ষণ করুন (এমনকি নতুনও)


53

আমি সাধারণত একটি ডিরেক্টরিতে অনেক লগ দেখতে পারি tail -f directory/*। সমস্যাটি হ'ল এর পরে একটি নতুন লগ তৈরি করা হয়, এটি স্ক্রিনে প্রদর্শিত হবে না (কারণ *এটি ইতিমধ্যে প্রসারিত ছিল)।

কোনও ডিরেক্টরিতে প্রতিটি ফাইল, এমনকি প্রক্রিয়া শুরু হওয়ার পরে তৈরি হওয়া ফাইলগুলি পর্যবেক্ষণ করার কোনও উপায় আছে কি?

উত্তর:


44

আপনি … মাল্টিটাইলের সাথে মাল্টি পিএল ফাইলগুলি টেল করতে পারেন ।

multitail -Q 1 'directory/*'

-Q 1 PATTERNমানে প্রতি 1 সেকেন্ডে PATTERN এর সাথে মিল থাকা বিদ্যমান বা নতুন ফাইলগুলিতে নতুন সামগ্রী অনুসন্ধান করা । সমস্ত ফাইলের লাইনগুলি একই উইন্ডোতে দেখানো হয়, পৃথক উইন্ডো -qনা রেখে ব্যবহার করুন -Q


10

xtailএছাড়াও একটি বিকল্প। এর ম্যান পেজ এটিকে বর্ণনা করে:

এক্সটেল এক বা একাধিক ফাইলের উপর নজর রাখে এবং কমান্ডের অনুরোধ করার পরে কোনও ফাইলে লেখা সমস্ত ডেটা প্রদর্শন করে। এটি একসাথে একাধিক লগফাইलों নিরীক্ষণের জন্য খুব দরকারী। কমান্ড লাইনে প্রদত্ত একটি এন্ট্রি যদি একটি ডিরেক্টরি হয় তবে সেই ডিরেক্টরিতে থাকা সমস্ত ফাইল মনিটর করা হবে, xtail অনুরোধের পরে তৈরি হওয়া ফাইলগুলি সহ। যদি কমান্ড লাইনে প্রদত্ত কোনও এন্ট্রি উপস্থিত না থাকে তবে টেক্সটেল এটির জন্য নজর রাখবে এবং একবার তৈরি হয়ে গেলে এটি পর্যবেক্ষণ করবে। ডিসপ্লেতে ফাইলগুলি স্যুইচ করার সময়, ফাইলের পাথের নাম সম্বলিত একটি ব্যানার মুদ্রিত হয়।

একটি বিঘ্নিত চরিত্র (সাধারণত সিটিআরএল / সি বা ডেল) সর্বাধিক সংশোধিত ফাইলগুলির তালিকা দেখাবে। টেক্সটেল থামাতে একটি প্রস্থান সিগন্যাল (সাধারণত সিটিআরএল / ব্যাকস্ল্যাশ) প্রেরণ করুন।


1
লিঙ্কটি নষ্ট হয়ে গেছে, তবে আমি মনে করি এটি একই: manpages.ubuntu.com/manpages/zesty/man1/xtail.1.html
এডপেইজ

7

শেল সলিউশন সম্পর্কে ধারণা নেই, তবে (লিনাক্স ধরে নিলে 1) inotifyযাওয়ার উপায় হতে পারে ... উদাহরণটি অনুকরণ করেtail -F (দেখুন pyinotify) দেখুন, সম্ভবত এটি একটি সম্পূর্ণ ডিরেক্টরি অনুসরণ করার জন্য ভিত্তি হিসাবে ব্যবহার করা যেতে পারে ।

সাধারণভাবে, inotifyডিরেক্টরিগুলি নিরীক্ষণ করতে পারে (উদ্ধৃতি man 7 inotify)

Inotify_add_watch (2) কে কল করার সময় নিম্নলিখিত বিটগুলি মাস্কে নির্দিষ্ট করা যেতে পারে এবং পড়ুন (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 (*).

ডিরেক্টরি নিরীক্ষণ করার সময় , উপরের তারকাচিহ্ন (*) দ্বারা চিহ্নিত ইভেন্টগুলি ডিরেক্টরি ফাইলগুলির জন্য ঘটতে পারে, সেই ক্ষেত্রে ফিরে আসা ইনোটাইফাইভেন্ট কাঠামোর নাম ক্ষেত্রটি ডিরেক্টরিতে থাকা ফাইলটির নাম চিহ্নিত করে।

(... এবং এই pyinotifyবিকল্পগুলি ঘনিষ্ঠভাবে অনুসরণ করে)

1: বিএসডিগুলির একটি একই জিনিস রয়েছে kqueue,। হয়তো একটি ক্রস-প্ল্যাটফর্ম সমাধান সাধনযোগ্য giờ (ব্যবহার করছে পাইথন বাইন্ডিং বিমূর্ততা স্তর হিসেবে) যেহেতু এটি, পাশে করতে 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
প্রকৃতপক্ষে, আপনি মূল লুপটিতে ঘুম 1 টি বাদ দিতে পারেন, নতুন ফাইলগুলি পেতে আরও চটজলদি হয়ে উঠবে। তবে আমি এই জাতীয় ব্যস্ততার অপেক্ষা করি না
Itamar

এর কারণে এটি sleepকোনও ব্যস্ত অপেক্ষা নয় বরং সিপিইউতে নরম, কেবল ভোটদান। যে কোনও এটি এটিকে sleep 0.2s(জিএনইউ স্লিপ) এ পরিবর্তন করতে পারে বা প্রয়োজনে এটি দ্রুত তৈরি করতে পারে।
নেড64

2

এছাড়াও আপনি ডিরেক্টরি সহ দেখতে পারেন watch

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

মাইনর নাইটপিক: কমান্ড থেকে আউটপুটের watchপ্রথম x লাইন সহ বিকল্প বাফারে স্ক্রীনটি আবার আঁকুন । কোনও পরিবর্তন ছাড়াই বেশ কয়েকটি ফাইল জুড়ে, যদি আগের ফাইলগুলি পরিবর্তন না হয় তবে tailপ্রতিটি সময় একই জিনিসটি রেন্ডার করা যেতে পারে, সুতরাং আপনি কোনও অতিরিক্ত এন্ট্রি উপস্থিত পাবেন কারণ সেগুলি নীচের অংশে 'নীচে' পরে আঁকা হয় পর্দা। একটি সংক্ষিপ্ত ফাইলের জন্য, যদিও এটি ঠিক আছে ...
jimbobmcgee

এটি মূল সমস্যার সমাধান দেয় না। এই ডিরেক্টরিতে watchসমস্ত ফাইলের সর্বশেষ লাইনের (নতুনগুলি সহ) পরিবর্তে এটি একটি ডিরেক্টরি তালিকা (বার বার, সর্বদা বর্তমান - ধন্যবাদ ) কেবল আউটপুট করে ।
trs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.