নতুন ফাইলগুলির জন্য ফোল্ডার নিরীক্ষণের স্ক্রিপ্ট?


127

স্ক্রিপ্ট সহ একটি ফোল্ডারে নতুন ফাইলগুলি কীভাবে সনাক্ত করা যায় ? ফোল্ডারে ফাইলগুলি তৈরি হওয়ার সাথে সাথে আমি প্রক্রিয়া করতে চাই। এটি করা কি সম্ভব বা আমার এমন একটি স্ক্রিপ্ট শিডিউল করতে হবে যা প্রতি মিনিটে কয়েক মিনিটের জন্য নতুন ফাইলগুলি পরীক্ষা করে?


1
ফোল্ডারগুলি প্রক্রিয়া হয়ে যাওয়ার পরে আপনি কি সেগুলি সরিয়ে ফেলছেন?
ztank1013

উত্তর:


151

আপনি inotifywaitউদাহরণ হিসাবে ব্যবহার করা বিবেচনা করা উচিত :

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

উবুন্টুতে প্যাকেজটি inotifywaitসরবরাহ করা হয় inotify-tools। সংস্করণ ৩.১13 অনুসারে (উবুন্টু ১২.০৪-তে বর্তমান) inotifywait-ফ বিকল্পটি ছাড়াই ফাইলের নাম অন্তর্ভুক্ত করবে। পুরানো সংস্করণ জোর করা প্রয়োজন হতে পারে। গুরুত্বপূর্ণ বিষয়টি যা গুরুত্বপূর্ণ তা হল ইভেন্ট ফিল্টারিংয়ের সেরা উপায়টি -eoption inotifywaitএছাড়াও, আপনার readআদেশটি একাধিক ভেরিয়েবলগুলিতে অবস্থানগত আউটপুট নির্ধারণ করতে পারে যা আপনি ব্যবহার বা উপেক্ষা করতে বেছে নিতে পারেন। আউটপুট প্রিপ্রোসেস করার জন্য গ্রেপ / সেড / অ্যাজক ব্যবহার করার দরকার নেই।


1
গ্রেট! inotifywaitআমি কি চেয়েছিলেন।
ইহাতেটোরিজিস্ট

2
শুধু এটি আপডেট করতে চান। এটি অর্জনের জন্য আপনার বিশ্রী প্রয়োজন নেই। আপনি ইভেন্টগুলি ফিল্ম করতে পারেন '-e তৈরি' দিয়ে এবং কেবল ফাইলের নাম '-f% f' করে বা '-f% w% f' ব্যবহার করে পুরো পথটি পেতে পারেন। সুতরাং উপরের স্ক্রিপ্টের প্রথম লাইনটি হয়ে যায়: inotifywait -m / path -f% w% f -e create |
লুগুইস

2
@ লুগুইস এবং এখন আপনি যখন- The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.তাই পাবেন তা ব্যবহার করার চেষ্টা করবেন , আপনি কেবলমাত্র inotifywait -m /path -e create |এই উত্তরটি চেষ্টা করে সম্পাদনা করতে যাবেন।
ব্রুনো ব্রোনোস্কি

1
এখন এটির জন্য একটি পোর্টেবল সরঞ্জামও রয়েছে fswatch। আমি এটি লিখিনি, তবে এটি ওপেন সোর্স এবং আমি এটি ব্যবহার করি।

1
@ ওয়ান্ডার ইনোটফাইওয়েট ট্রিগার করা হলে এক লাইনে 3 টি টুকরো তথ্য আউটপুট দেয়। 'রিড' বাশ অন্তর্নির্মিত ইনপুট লাইনটি পড়ে এবং তিনটি টুকরো প্রতিটি তথ্যকে একটি ভেরিয়েবলের জন্য বরাদ্দ করে। সুতরাং প্রথম টুকরাটি পরিবর্তনশীল পথে, দ্বিতীয়টি ক্রিয়াতে এবং তৃতীয়টি ফাইলের জন্য বরাদ্দ করা হয়। এই ভেরিয়েবলগুলিতে মান নির্ধারিত হওয়ার পরে সেগুলি পরে ব্যবহারের জন্য উপলব্ধ (ইকো লাইনের মতো)। আরও তথ্য: tldp.org/LDP/Bash-Beginners- Guide
টিম

26

আমি পছন্দ করি incron, এটি পরিচালনা করা সহজ হিসাবে। মূলত এটি একটি পরিষেবা যা লাভ করে inotifyএবং আপনি ফাইল পরিবর্তন ক্রিয়াকলাপের উপর ভিত্তি করে ব্যবস্থা গ্রহণের জন্য কনফিগারেশন সেটআপ করতে পারেন।

উদা:

<directory> <file change mask> <command or action>  options
/var/www/html IN_CREATE /root/scripts/backup.sh

আপনি এখানে একটি সম্পূর্ণ উদাহরণ দেখতে পারেন: http://www.cyberciti.biz/faq/linux-inotify-example-to-replicate-directories/


24

আমি কেবল এটি রান্না করেছি এবং চেকগুলির মধ্যে ফাইল হারিয়ে যাওয়ার ক্ষুদ্র সম্ভাবনা বাদে এটি নিয়ে কোনও বড় সমস্যা দেখছি না।

while true
do
       touch  ./lastwatch
       sleep 10
       find /YOUR/WATCH/PATH -cnewer ./lastwatch -exec SOMECOMMAND {} \;
done

যদি আপনার ফাইল প্রসেসিং খুব বেশি সময় না নেয়, আপনার কোনও নতুন ফাইল মিস করা উচিত নয়। আপনি ক্রিয়াকলাপের ব্যাকগ্রাউন্ডও করতে পারেন ... এটি বুলেট প্রুফ নয়, তবে এটি ইনোটাইফাইয়ের মতো বাহ্যিক সরঞ্জাম ছাড়া কিছু উদ্দেশ্যে কাজ করে ser


ভালো বল ধরা. ফাইলনামগুলিতে স্পেস সমর্থন করার জন্য আমি এটি কিছুটা উন্নত করেছি।
মাইকেল সাচ্চি

একেবারে। এটাই যাওয়ার পথ। আমি কেন এই রাস্তায় নেমেছি তা সত্যই নিশ্চিত নয়, আমি নিয়মিত-এক্সেক ব্যবহার করি।
মাইকেল সাচ্চি

এটি রিয়েলটাইম নয়। রিয়েলটাইম সর্বদা সেরা
ফারহান

3
যদি inotifyনা পাওয়া যায় তবে সেরা সমাধান । আমি -type fকেবল ফাইলগুলি ফিল্টার করতে যোগ করব । অন্যথায় ফোল্ডারটিও ফিরে আসবে।
জিয়াও পেং - ZenUML.com

হ্যাঁ - -f filenameবিকল্পটি দুর্দান্ত। সুতরাং কেবলমাত্র অবশিষ্ট প্রশ্নটি এটি পুনরায় বুট করার পরে কীভাবে শুরু করা যায়। আমি এটিকে আমার সৌর উদ্ভিদের সাথে ব্যবহার করতে যাচ্ছি os.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")তাই এই ফাইলটি তৈরি করার ফলে মাস্টার কম্পিউটারটি espeakকম ভোল্টেজ ব্যবহার এবং ঘোষণা করবে। এটি ইতিমধ্যে আমাকে একটি ইমেল প্রেরণ করেছে তবে যেহেতু আমার সিস্টেম ইতিমধ্যে ঘন্টাটির শীর্ষে সময়টি বলেছে তাতে বাকি সমস্ত কিছু রয়েছে। জিজ্ঞাসাবাবু
প্রশ্ন /

17

আপনি watchআপনার স্ক্রিপ্ট ব্যবহার করতে পারেন

watch -n 0.1 ls <your_folder>

আপনার ফোল্ডারটি পর্যবেক্ষণ করে এবং প্রতি 0.1 সেকেন্ডে আপনাকে এতে সমস্ত কিছু তালিকাভুক্ত করে

অপূর্ণতা

আসল সময় নয়, সুতরাং যদি কোনও ফাইল 0.1 সেকেন্ডেরও কম সময়ে তৈরি এবং মুছে ফেলা হয়, তবে এটি কাজ করবে না, watchকেবল সর্বনিম্ন 0.1 সেকেন্ডের সমর্থন করে।


ঠিক সেটাই আমি মনে করার চেষ্টা করছিলাম! অনেক ধন্যবাদ!!
জোবায়ে লুচেনা

9

আমি ধরে নিচ্ছি লক্ষ্যযুক্ত ফোল্ডারটি (আমি isemptyকেবল এটি সুবিধার জন্য কল করব ) খালি আছে এবং আপনি সেখানে এক বা একাধিক ফাইল নেওয়ার জন্য অপেক্ষা করছেন।

আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

ls -1A isempty | wc -l

ফোল্ডারটি এখনও খালি আছে কিনা তা পরীক্ষা করার জন্য, কোনও নতুন ফাইল না থাকলে আসলে এটি 0 ফিরিয়ে দেবে (অন্যদিকে, isemptyফোল্ডারটি এখনও খালি রয়েছে) বা অন্যদিকে এটি 0 এর চেয়ে বেশি মান প্রদান করবে (আসলে সংখ্যাটি বর্তমানে ফোল্ডারে থাকা ফাইলগুলির)।

এটি নির্বোধ বলেছে যদি / তারপরে পরীক্ষা বাকী কাজটি করতে পারে:

if [ $(ls -1A isempty | wc -l) -gt 0 ] ; then do_something ; fi

অবশ্যই do_somethingফাংশনটি isemptyফোল্ডারের মধ্যে ফাইল (গুলি) ম্যানিপুলেট করতে হবে এবং তারপরে প্রক্রিয়া করার পরে ফোল্ডার থেকে নিজেই এটি (তাদের) সরিয়ে ফেলতে হবে।

আপনার ক্রন্টবায় নীচের মতো একটি লাইন যুক্ত করা একটি মিনিট একবার চেকটি চালাবে এবং do_somethingফোল্ডারটি অবশ্যই ফাঁকা না থাকলে ক্রিয়াটি ট্রিগার করবে :

* * * * *     if [ $(ls -1A isempty | wc -l) -gt 0 ] ; then do_something ; fi

এই সমাধানটি মাউন্ট করা রিমোট ফাইল সিস্টেমগুলির জন্য কাজ করে। inotify- সরঞ্জাম বিকাশকারী (গুলি) ফিউজে কাজ করছে (বা 2014 এর মাঝামাঝি ছিল)।
রনডো

3
আপনার কখনও lsস্ক্রিপ্টিংয়ের জন্য ব্যবহার করা উচিত নয় । findপরিবর্তে ব্যবহার করুন বা সাধারণ গ্লোববিং করুন: mywiki.wooledge.org/ParsingLs
andsens

6

আপনি যদি নতুন ফাইলগুলি সনাক্ত করতে চান, তবে সেগুলি প্রক্রিয়া করুন এবং শেষের দিকে এগিয়ে যাওয়া ফাইলগুলি মুছুন আপনি systemd.path ব্যবহার করতে পারেন । Inotif এ এই পদ্ধতি বেস। ডিরেক্টরি অপরিহার্য বিকল্প রয়েছে, সুতরাং ডিরেক্টরিতে কোনও ফাইল সনাক্ত করলে সিস্টেমড আপনার স্ক্রিপ্টটি সর্বদা চালাতে পারে। আপনার মনে রাখতে হবে এটি কেবলমাত্র তখনই কাজ করবে যদি আপনি এগিয়ে যাওয়া ফাইল এবং স্ক্রিপ্টের পাতা ডিরেক্টরি খালি মুছতে পারেন।

প্রথমে mymonitor.service ফাইল প্রস্তুত করুন

[Unit]
Description=Start the script

[Service]
Type=oneshot
ExecStart=/path/to/your/script

এরপরে পাথটি সংজ্ঞায়িত করতে mymonitor.path এ যান

[Unit]
Description= Triggers the service

[Path]
DirectoryNotEmpty=/path/to/monitor

[Install]
WantedBy=multi-user.target

.Path ফাইলের নাম যদি পরিষেবার নামের সাথে একই হয় তবে .path ফাইলে পরিষেবার নাম উল্লেখ করার দরকার নেই।

এটি ডমিগুলির জন্য মনিটরিং ফাইল অ্যাক্সেসের ভিত্তি করে


4

entr

entrএটি করার নতুন উপায়টি ব্যবহার করা (এটি ক্রস প্ল্যাটফর্ম)। নোটটি entrবিকল্পের অনেকের পক্ষে এটির বিশাল সুবিধা প্রদান করে পোলিং ব্যবহার করে না।

ব্যবহার kqueue(2)বা inotify(7)পোলিং এড়ানোর জন্য। entrদ্রুত প্রতিক্রিয়া জানাতে এবং স্বয়ংক্রিয় পরীক্ষার প্রাকৃতিক এবং সম্পূর্ণ সাধারণ করতে লেখা হয়েছিল।

বিএসডি-তে এটি ব্যবহার করে pledge(2)

আপনি এটি দিয়ে ইনস্টল করতে পারেন

apt-get install entr
dnf install entr

আপনি নতুন সংযোজন ব্যবহার করে একটি ডিরেক্টরি ট্র্যাক করতে পারেন

while $(true); do
  # echo ./my_watch_dir | entr -dnr echo "Running trigger..."
  echo ./my_watch_dir | entr -dnr ##MY COMMAND##
done;

বিকল্পগুলি (ডক্স থেকে) ব্যাখ্যা করা হয়েছে,

  • -d ইনপুট হিসাবে সরবরাহিত নিয়মিত ফাইলগুলির ডিরেক্টরিগুলি ট্র্যাক করুন এবং যদি কোনও নতুন ফাইল যুক্ত হয় তবে প্রস্থান করুন। এই বিকল্পটি ডিরেক্টরিগুলি স্পষ্টভাবে নির্দিষ্ট করতে সক্ষম করে। নামের সাথে ফাইলগুলি 'দিয়ে শুরু হয়।' অবহেলা করা হয়।
  • -nঅ-ইন্টারেক্টিভ মোডে চালান। এই মোডে প্রবেশকারী টিটিওয়াই থেকে পড়ার বা এর বৈশিষ্ট্যগুলি পরিবর্তন করার চেষ্টা করে না।
  • -r একটি অবিরাম শিশু প্রক্রিয়া পুনরায় লোড করুন। অপারেশনটির স্ট্যান্ডার্ড মোডের মতো, একটি ইউটিলিটি যা শেষ করে কোনও ফাইল সিস্টেম বা কীবোর্ড ইভেন্ট প্রক্রিয়া না করা পর্যন্ত আবার কার্যকর করা হয় না। SIGTERMপুনরায় চালু হওয়ার আগে ইউটিলিটিটি সমাপ্ত করতে ব্যবহৃত হয়। শেল স্ক্রিপ্টগুলি মাস্কিং সংকেত থেকে রোধ করতে একটি প্রক্রিয়া গ্রুপ তৈরি করা হয়। entrসকেটের মতো সংস্থানগুলি বন্ধ করা হয়েছে তা নিশ্চিত করার জন্য ইউটিলিটিটি প্রস্থান করার জন্য অপেক্ষা করে। টিটিওয়াই নিয়ন্ত্রণ শিশু প্রক্রিয়া স্থানান্তরিত হয় না।

2

বাশ এটি সহজেই করতে পারে না। আপনাকে মূলত ফোল্ডারের সমস্ত ফাইলের একটি তালিকা পেতে হবে এবং পর্যায়ক্রমে একটি নতুন তালিকা পেতে হবে এবং কী পরিবর্তিত হয়েছে তা দেখার জন্য তাদের তুলনা করতে হবে।

আপনি যা খুঁজছেন তাকে ইনোটিফাই বলা হয়। এটি লিনাক্স কার্নেলের মধ্যে নির্মিত এবং আপনি মূলত সেখানে বসে কিছু হওয়ার জন্য অপেক্ষা করতে পারেন যার বিন্দুতে ইনোটিফাই ফিরে আসে এবং বলে 'আরে, সেখানে একটি নতুন ফাইল রয়েছে ফুবার'

আপনি যা চান তা সম্পাদন করতে আপনাকে পার্লের মতো কোনও কিছুর দিকে যেতে হবে এবং লিনাক্স :: ইনোটাইফাই 2 ব্যবহার করতে হবে (পাইথন সম্ভবত ইনোটাইফাই সমর্থন করে তবে আমি একজন পার্ল ব্যক্তি)।


0

এটি সাইগউইন এবং লিনাক্সে কাজ করে। পূর্ববর্তী সমাধানগুলির মধ্যে কিছু যা একটি ফাইল লিখলে ডিস্কটি ছিন্ন হতে পারে। এই স্কিপ্টটিতে সমস্যা নেই:

SIG=1
SIG0=$SIG
while [ $SIG != 0 ] ; do
 while [ $SIG = $SIG0 ] ; do
   SIG=`ls -1 | md5sum | cut -c1-32`
   sleep 10
 done
 SIG0=$SIG
 ls -lrt | tail -n 1
done

0

নীচে স্ট্যাকওভারফ্লোতে উদাহরণের একটি সংক্ষিপ্ত সংস্করণ যা আমি পরীক্ষা করেছি এবং আমার একটি প্রকল্পের সাথে সংযুক্ত করেছি যাতে নির্দিষ্ট ডিরেক্টরিগুলির নিরীক্ষণের প্রয়োজন হয়।

Var_dir="${1:-/tmp}"
Var_diff_sleep="${2:-120}"
Var_diff_opts="--suppress-common-lines"
Func_parse_diff(){
    _added="$(grep -E '>' <<<"${@}")"
    if [ "${#_added}" != "0" ]; then
        mapfile -t _added_list <<<"${_added//> /}"
        _let _index=0
        until [ "${#_added_list[@]}" = "${_index}" ]; do
            _path_to_check="${Var_dir}/${_added_list[${_index}]}"
            if [ -f "${_path_to_check}" ]; then
                echo "# File: ${_path_to_check}"
            elif [ -d "${_path_to_check}" ]; then
                echo "# Directory: ${_path_to_check}"
            if [ -p "${_path_to_check}" ]; then
                echo "# Pipe: ${_path_to_check}"
            fi
            let _index++
        done
        unset _index
    fi
}
Func_watch_bulk_dir(){
    _current_listing=""
    while [ -d "${Var_dir}" ]; do
        _new_listing="$(ls "${Var_dir}")"
        _diff_listing="$(diff ${Var_dec_diff_opts} <(${Var_echo} "${_current_listing}") <(${Var_echo} "${_new_listing}"))"
        if [ "${_diff_listing}" != "0" ]; then
            Func_parse_diff "${_diff_listing}"
        fi
        _current_listing="${_new_listing}"
        sleep ${Var_diff_sleep}
    done
}

এখানে স্ক্রিপ্টের একটি লিঙ্ক যা এর sshfs মাউন্ট পয়েন্টে স্বয়ংক্রিয়ভাবে ফাইল বা ডিরেক্টরিগুলি ডিক্রিপ্ট করার জন্য উপরের পরিবর্তিত সংস্করণ ব্যবহার করে; পূর্বোক্ত প্রকল্প

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.