কোনও ডিরেক্টরিতে লিনাক্সের বিষয়বস্তু পরিবর্তিত হলে কীভাবে স্বয়ংক্রিয়ভাবে স্ক্রিপ্টটি চালানো যায়?


17

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


এই আলোচনা যে stackexchange সাইটে অনুষ্ঠিত হয়েছে;) দেখতে superuser.com/questions/181517/... stackoverflow.com/questions/4380527/... ইত্যাদি
masterxilo

উত্তর:


17

আপনি ডেবিয়ান-ভিত্তিক বিতরণে থাকতে যথেষ্ট ভাগ্যবান হলে apt-get install dnotify,। অন্যান্য বিতরণে সম্ভবত কিছু অনুরূপ রয়েছে - dnotifyনামটি দেখুন।

লিনাক্স কার্নেল ২.৪.১৯ + এর ডনটিফাই এপিআই ভিত্তিক ডোনটিফাই একটি সাধারণ প্রোগ্রাম a ডনটাইফাই প্রতিটি সময় একটি নির্দিষ্ট নির্দেশিকার সামগ্রীর পরিবর্তনে একটি নির্দিষ্ট কমান্ড কার্যকর করতে পারে। এটি কমান্ড লাইন থেকে চালিত হয় এবং দুটি আর্গুমেন্ট গ্রহণ করে: নিরীক্ষণের জন্য এক বা একাধিক ডিরেক্টরি এবং যখনই ডিরেক্টরি পরিবর্তন হয় তখন চালানো একটি আদেশ। বিকল্পগুলি কী ইভেন্টগুলিতে ট্রিগার করতে হবে তা নিয়ন্ত্রণ করে: ডিরেক্টরিতে যখন কোনও ফাইল পাঠ করা হয়, যখন কোনওটি তৈরি করা হয়েছিল, মুছে ফেলা হয়েছে ইত্যাদি।

আপনি যদি নিজের প্রোগ্রামের মধ্যে এটি পরিচালনা করতে চান তবে ডোনটিফাই হ'ল আপনার ব্যবহার করতে চান এমন API।


4
@ মাইকেবি, গুগলিং আপনার প্রস্তাবিত নোটিফাইয়ের পরে, আমি পরিবর্তে ইনোটিফাই ব্যবহার করে শেষ করেছি, যা সম্ভবত এটির চেয়ে বেশি। আমাকে সঠিক দিক নির্দেশ করার জন্য ধন্যবাদ। অ্যাপটি-ইনটাইফাই-সরঞ্জামগুলি ইনস্টল করুন
জিনিকিউ

7
@ জেনিকিউ, ইনোটাইফাই ডনটিফাই প্রতিস্থাপন করেছে।
ডেভিড

1
অনুরূপভাবে জেন্টুতে:emerge inotify-tools
জেমস স্নেরিঞ্জার

হ্যাঁ, আমি বলতে যাচ্ছি, কার্নেল ২.৪.১৯৯ একপ্রকার প্রাচীন ;-) ইনোটিফাই হবার উপায়।
ডেভিড জেড

ওহ হ্যাঁ ... আমি ভুলে গিয়েছিলাম যা আরও সাম্প্রতিক ছিল :)
মাইকিবি

12

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

#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
    rsync [options] /home/me/code/ /media/nfs/code/ 
done

কেবল অ্যাকাউন্টে বিবেচনা করুন যে যদি উত্স ডিরেক্টরিটি অনুলিপি করার সময় পরিবর্তিত হয় তবে ইনোটিফয়েট এটি দেখতে পাবে না এবং অনুলিপিগুলি শেষ হওয়ার পরে এই পরিবর্তনগুলি অনুলিপি করা হবে না once সম্ভবত যদিও কোনও সমস্যা নয় not
রাউল সালিনাস-মন্টেইগুডো

আপনি কীভাবে এটি ডেমন মোডে চালাতে পারেন?
ক্রিস এফ

4

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

আমি বিশ্বাস করি যে উবুন্টু এবং ডেবিয়ান সহ অনেক বিতরণের জন্য ইনক্রন প্যাকেজড রয়েছে।


0

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


0

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

যুক্ত করা ফাইলটি সনাক্ত করতে এবং এটিতে কাজ করার জন্য, এটি অন্যান্য সরঞ্জামের সাথে যেমন: উদাহরণস্বরূপ একত্রিত করুন makeentrনাম বা এর মতো কিছু প্রেরণ করে না, আপনি যা চালানোর জন্য বলেছিলেন তা কেবল এটি চালায়।

ডিরেক্টরিতে যুক্ত ফাইলগুলি পরীক্ষা করতে:

## 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এবং প্রক্রিয়া প্রতিকল্পন ( <(...)) গুরুত্বপূর্ণ একটি প্রক্রিয়া ম্যানেজার থেকে চলমান, সঠিকভাবে সংকেত পরিচালনা করতে হয় (অর্থাত পথ থেকে শেল পেতে)।

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