যখনই নতুন ফাইলগুলি কোনও নির্দিষ্ট ডিরেক্টরিতে অনুলিপি করা হয় আমি স্বয়ংক্রিয়ভাবে একটি স্ক্রিপ্ট চালাতে চাই। অন্য কথায়, লিনাক্সের পরিবর্তনের জন্য একটি ডিরেক্টরি "দেখার" এবং তারপরে পরিবর্তনের প্রতিক্রিয়াতে কিছু চালানোর কোনও উপায় আছে কি?
যখনই নতুন ফাইলগুলি কোনও নির্দিষ্ট ডিরেক্টরিতে অনুলিপি করা হয় আমি স্বয়ংক্রিয়ভাবে একটি স্ক্রিপ্ট চালাতে চাই। অন্য কথায়, লিনাক্সের পরিবর্তনের জন্য একটি ডিরেক্টরি "দেখার" এবং তারপরে পরিবর্তনের প্রতিক্রিয়াতে কিছু চালানোর কোনও উপায় আছে কি?
উত্তর:
আপনি ডেবিয়ান-ভিত্তিক বিতরণে থাকতে যথেষ্ট ভাগ্যবান হলে apt-get install dnotify
,। অন্যান্য বিতরণে সম্ভবত কিছু অনুরূপ রয়েছে - dnotify
নামটি দেখুন।
লিনাক্স কার্নেল ২.৪.১৯ + এর ডনটিফাই এপিআই ভিত্তিক ডোনটিফাই একটি সাধারণ প্রোগ্রাম a ডনটাইফাই প্রতিটি সময় একটি নির্দিষ্ট নির্দেশিকার সামগ্রীর পরিবর্তনে একটি নির্দিষ্ট কমান্ড কার্যকর করতে পারে। এটি কমান্ড লাইন থেকে চালিত হয় এবং দুটি আর্গুমেন্ট গ্রহণ করে: নিরীক্ষণের জন্য এক বা একাধিক ডিরেক্টরি এবং যখনই ডিরেক্টরি পরিবর্তন হয় তখন চালানো একটি আদেশ। বিকল্পগুলি কী ইভেন্টগুলিতে ট্রিগার করতে হবে তা নিয়ন্ত্রণ করে: ডিরেক্টরিতে যখন কোনও ফাইল পাঠ করা হয়, যখন কোনওটি তৈরি করা হয়েছিল, মুছে ফেলা হয়েছে ইত্যাদি।
আপনি যদি নিজের প্রোগ্রামের মধ্যে এটি পরিচালনা করতে চান তবে ডোনটিফাই হ'ল আপনার ব্যবহার করতে চান এমন API।
emerge inotify-tools
আপনি ইনোটাইফাই-সরঞ্জামগুলি দিয়ে স্ক্রিপ্টটি চালাতে পারেন, এরকম কিছু। এটি পরিবর্তিত ফাইল, নতুন ফাইল এবং মুছে ফেলা ফাইলগুলির পরিবর্তনের জন্য ডিরেক্টরিটি দেখবে, তারপরে এটি স্ক্রিপ্টটি কার্যকর করবে।
#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
rsync [options] /home/me/code/ /media/nfs/code/
done
incron মূলত কি আপনি চান, আমি মনে করি নেই। এটি নোটিফিকেশন মেকানিজম হিসাবে অবিচ্ছিন্ন ব্যবহার করে (যা অন্যরা দেখিয়েছে, সুপারসিডিজ ডোনটিফাই করেছে), তবে এমন স্ক্রিপ্টের দরকার নেই যা অবিচ্ছিন্নভাবে চালিত হয়, ইনোটেফুইট বা অনুরূপ ব্যবহার করে (যদিও স্পষ্টতই, ইনক্রন ডিমন সব সময় চলছে)। সিস্টেম-প্রশস্ত 'ক্রোনট্যাবস' এবং ব্যবহারকারী 'ক্রোনট্যাবস' একইভাবে স্ট্যান্ডার্ড ক্রোন হিসাবে সমর্থিত, তবে সময়গুলি ট্রিগার হিসাবে নির্দিষ্ট করার পরিবর্তে ইভেন্টগুলি ইনোটিফাই করা এবং ফাইল / ডিরেক্টরি নাম ব্যবহার করা হয়।
আমি বিশ্বাস করি যে উবুন্টু এবং ডেবিয়ান সহ অনেক বিতরণের জন্য ইনক্রন প্যাকেজড রয়েছে।
এন্টারটি আমি দেখেছি সবচেয়ে সহজ এবং সবচেয়ে কমপোজযোগ্য ফাইল নোটিফিকেশন সরঞ্জাম। এটির ডিরেক্টরি ডিরেক্টরি পরিবর্তে ফাইল দেখার দিকে অনুকূলিত হয়েছে, তবে এটি আপনার কেসও সমাধান করতে পারে।
যুক্ত করা ফাইলটি সনাক্ত করতে এবং এটিতে কাজ করার জন্য, এটি অন্যান্য সরঞ্জামের সাথে যেমন: উদাহরণস্বরূপ একত্রিত করুন make
। entr
নাম বা এর মতো কিছু প্রেরণ করে না, আপনি যা চালানোর জন্য বলেছিলেন তা কেবল এটি চালায়।
ডিরেক্টরিতে যুক্ত ফাইলগুলি পরীক্ষা করতে:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
আপনি যদি বিদ্যমান ফাইল পরিবর্তিত হয়ে কাজ করতে চান তবে:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... এবং এই যেখানে লুপ প্রক্রিয়াটি কাজে আসবে, কারণ find
কোনও ফাইল যুক্ত হলে এক্সপ্রেশন আবার চলবে।
আপনি যদি আরও ভাল ত্রুটি পরিচালনা করতে চান এবং নিশ্চিত করতে চান যে প্রতি যোগ করা / সরানো ফাইল প্রতি জিনিসগুলি একবার চালানো হয় তবে জিনিসগুলি কিছুটা কৌতূহল প্রাপ্ত হয়, তবে এই সাধারণ ক্ষেত্রে এটি দুর্দান্ত।
সম্পাদনা করুন: আপনি যদি একটি সিস্টেম লেভেলে এই কাজ করতে চান, ভালো কিছু incron শুধু স্ক্রিপ্ট আপনার প্রিয় প্রক্রিয়া ম্যানেজারের সাথে (যেমন যোগ S6 , runit , systemd বা sysvinit এবং লুপ লাফালাফি:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
exec
এবং প্রক্রিয়া প্রতিকল্পন ( <(...)
) গুরুত্বপূর্ণ একটি প্রক্রিয়া ম্যানেজার থেকে চলমান, সঠিকভাবে সংকেত পরিচালনা করতে হয় (অর্থাত পথ থেকে শেল পেতে)।