ভিআইএম সহ ইনোটিফয়েট ব্যবহার করা


14

আমার কাছে সরল স্ক্রিপ্ট রয়েছে যা পরিবর্তনের জন্য ফাইল পর্যবেক্ষণ করে এবং এটিকে দূরবর্তী অনুলিপি দ্বারা সংযুক্ত করে:

#!/bin/bash

while inotifywait -e close_write somefile
do
    rsync somefile user@host.domain:./somefile
done

এটি ন্যানো দিয়ে ঠিক কাজ করে তবে ভিমে ব্যর্থ হয়। যখন আমি ন্যানো ব্যবহার করি, তখন এটি আউটপুট দেয়:

somefile CLOSE_WRITE,CLOSE   

এবং পরবর্তী লুপ শুরু করে অন্য সংস্করণের জন্য অপেক্ষা করছে।

আমি যখন ভিএম ব্যবহার করি তখন কোনও আউটপুট থাকে না, স্ক্রিপ্টটি কেবল প্রস্থান কোড 0 দিয়ে বন্ধ হয়।

আমি কিছু গবেষণা করেছি এবং জানতে পেরেছি যে ক্লোজ_ রাইটটি ভিউমের সাথে প্রথম দিকে ইনফিংওয়েট করার সঠিক পরামিতি (প্রথম আমি ইভেন্টটি সংশোধন করতে চাইছিলাম), তবুও কোনও কারণে এটি আমার জন্য ব্যর্থ।


এটা আমার জন্য কাজ করে. আপনি কেবল সম্পাদনার জন্য খোলার পরিবর্তে ফাইলটি সংরক্ষণের আগে ভিমে পরিবর্তন করেছিলেন?
রোয়াইমা

@roaima backupcopyঅপশনটি বন্ধ থাকলে এটি কাজ করে ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


15

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

ন্যানো দৃশ্যত বিদ্যমান ফাইলটি ওভাররাইট করে। আপনার স্ক্রিপ্টটি লেখার ( close_writeইভেন্ট) শেষ করার পরে পয়েন্টটি সনাক্ত করে এবং rsyncসেই সময়ে চলে। নোট করুন যে আরএসসিএনসি প্রথম সেভ থেকে কাজ সরিয়ে নেওয়ার আগে, যদি আপনি দ্রুত পরপর দুটি বার সংরক্ষণ করেন তবে ফাইলের অসম্পূর্ণ সংস্করণটি ধরা সম্ভব grab

অন্যদিকে, ভিম লেখার-পরে-সরানোর কৌশলটি ব্যবহার করে - এর প্রভাবের কিছু

echo 'new content' >somefile.new
mv -f somefile.new somefile

ফাইলটির পুরাতন সংস্করণে যা ঘটে তা হ'ল এটি সেই স্থানে মুছে ফেলা হয় যেখানে নতুন সংস্করণটি স্থানান্তরিত হয়। এই মুহুর্তে, inotifywaitকমান্ডটি ফিরে আসে, কারণ এটি দেখার জন্য বলা ফাইলটি আর বিদ্যমান নেই no ( somefileএকই নামের নতুন একটি আলাদা ফাইল)) যদি ভিম একটি ব্যাকআপ ফাইল তৈরির জন্য কনফিগার করা থাকে, তবে কী ঘটবে তা হ'ল

echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile

এবং inotifywaitএখন ব্যাকআপ দেখা হবে।

ফাইল সংরক্ষণের কৌশলগুলি সম্পর্কে আরও তথ্যের জন্য দেখুন একটি প্রোগ্রাম চলাকালীন কোনও লাইভ আপডেট করা কীভাবে সম্ভব? এবং ফাইল অনুমতি এবং সংরক্ষণ

উইমকে ওভাররাইট কৌশলটি ব্যবহার করতে বলা যেতে পারে: backupcopyবিকল্পটি বন্ধ করুন ( :set nobackupcopy)। এটি ঝুঁকিপূর্ণ, উপরে উল্লিখিত হিসাবে।

উভয় সংরক্ষণ কৌশলগুলি পরিচালনা করতে, ডিরেক্টরিটি দেখুন এবং উভয় close_writeএবং moved_toইভেন্টগুলিকে ফিল্টার করুন somefile

inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
  if [ "$file" = "somefile" ]; then
    …
  fi
done

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

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

@ গিলিস আমি সিদ্ধান্ত নিয়েছি while true; do inotifywait ... [no -m]; make; sleep .1; done;বা তাই করেছি। কিছু গোটাচা রয়েছে তবে আমি বেশ কার্যকর কিছুতে পৌঁছেছি।
সীমাবদ্ধ প্রায়শ্চিত্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.