ফাইলটি লেখার প্রক্রিয়া চলছে কিনা তা নির্ধারণ করুন?


25

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

এই টার্ন ফাইলগুলি অন্য সার্ভার থেকে এসএসএইচ-এর মাধ্যমে স্বয়ংক্রিয়ভাবে এই সার্ভারে অনুলিপি করা হয়। কিছু ক্ষেত্রে, টার ফাইলগুলি প্রচুর ফাইল সহ অত্যন্ত বড়।

সমস্যাটি যেটির মধ্যে আমি চালানোর আশা করছি: যদি টার ফাইলটি সার্ভারে অনুলিপি করতে 1 মিনিট সময় নেয় এবং ক্রোন লিপিটি প্রতি মিনিটে একবার চালিত হয় তবে এটি .tar.gz ফাইলটি দেখতে চলেছে এবং চেষ্টা করার চেষ্টা করছে এটি অনার করুন, যদিও টার ফাইলটি এখনও লিখিত হওয়ার প্রক্রিয়াধীন রয়েছে।

বর্তমানে কোনও ফাইল লিখিত হচ্ছে কিনা তা পরীক্ষা করার কোনও উপায় আছে (বাশ কমান্ডের মাধ্যমে), বা এটি কেবলমাত্র একটি আংশিক ফাইল ইত্যাদি?

আমি যে বিকল্পটির কথা ভাবছিলাম তা হ'ল ফাইলটি একটি আলাদা ফাইল এক্সটেনশন (পছন্দ করা .tar.gz.part) হিসাবে অনুলিপি করা হবে এবং তারপরে .tar.gzস্থানান্তর সম্পূর্ণ হওয়ার পরে নতুন নামকরণ করা হবে । তবে আমি অনুভব করেছি যে আমি প্রথমে কমান্ড লাইনে ফাইলটি পুরো কিনা তা নির্ধারণ করার কোনও উপায় আছে কিনা তা খুঁজে বের করার চেষ্টা করব ... কোনও সূত্র?


2
ফাইলটি ঠিক কীভাবে স্থানান্তরিত হচ্ছে? উদাহরণস্বরূপ, rsyncস্থানান্তরকালে অস্থায়ী ফাইলের নাম ব্যবহার করা হয় (ডিফল্টরূপে) এবং কেবলমাত্র ফাইলটি পুরোপুরি স্থানান্তরিত হওয়ার পরে , এটি প্রকৃত ফাইলনামে পুনরায় নামকরণ করে।
পিসকভোর

উত্তর:


12

আপনি সঠিক পথে আছেন, ফাইলটির নামকরণ একটি পারমাণবিক ক্রিয়াকলাপ, তাই আপলোডের পরে পুনরায় নামকরণ করা সহজ, মার্জিত এবং ত্রুটির প্রবণ নয়। আমি যে অন্য পদ্ধতির কথা ভাবতে পারি lsof | grep filename.tar.gzতা হ'ল ফাইলটি অন্য কোনও প্রক্রিয়া দ্বারা অ্যাক্সেস করা হচ্ছে কিনা তা পরীক্ষা করা।


7
(এর lsof filename.tar.gzচেয়ে আরও দক্ষ এবং আরও নির্ভুল lsof | grep filename.tar.gz)
ধনী

বিটিডাব্লু, এটি ফাইলের
নামের

14

lsofকোনও প্রক্রিয়া দ্বারা কোনও ফাইল খোলা হয়েছে কিনা তা নির্ধারণ করতে আপনার সেরা বেটটি হ'ল :

#  lsof -f -- /var/log/syslog
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
rsyslogd 1520 syslog    1w   REG  252,2    72692 16719 /var/log/syslog

এটি লিখিত হওয়ার প্রক্রিয়াধীন কিনা তা আপনি সহজেই বলতে পারবেন না, তবে যদি এটি লিখিত হয় তবে এটি অবশ্যই উন্মুক্ত।


সম্পাদনা: প্রস্তাবিত সমাধানটি বাস্তবায়নের পরিবর্তে আসল সমস্যাটি এখানে সমাধান করা যাক!

ফাইলটি স্থানান্তর করতে rsync ব্যবহার করুন:

  rsync -e ssh remote:big.tar.gz .

এইভাবে, ফাইলটি বিদ্যমান ফাইলের শীর্ষে অনুলিপি করা হবে না .big.tar.gz.XXXXXXতবে স্থানান্তর সম্পূর্ণ না হওয়া পর্যন্ত একটি অস্থায়ী ফাইল ( ) এ অনুলিপি করা হবে না , পরে স্থানে সরিয়ে নেওয়া হবে।


6

কিছুটা পুরানো, তবে বেশিরভাগ উত্তর পুরোপুরি প্রশ্নের পয়েন্টটি মিস করে:

তবে আমি অনুভব করেছি যে আমি প্রথমে কমান্ড লাইনে ফাইলটি পুরো কিনা তা নির্ধারণ করার কোনও উপায় আছে কিনা তা সনাক্ত করার চেষ্টা করব ...

সাধারণভাবে, নেই। এটি নির্ধারণ করার জন্য আপনার কাছে পর্যাপ্ত তথ্য নেই।

কারণ ফাইলটি বন্ধ রয়েছে তা নির্ধারণ করা ফাইলটি পুরো কিনা তা নির্ধারণের মতো নয় । উদাহরণস্বরূপ, স্থানান্তরের মাধ্যমে সংযোগটি আংশিকভাবে হারিয়ে গেলে কোনও ফাইল "বন্ধ" হয়ে যায়।

কেবলমাত্র @ অ্যালেক্সের উত্তরটি এই অধিকার পেয়েছে। এমনকি তিনি lsofকিছুটা ব্যবহারের জন্য পড়ে গিয়েছিলেন ।

ফাইলটি সম্পূর্ণরূপে হয়েছে কিনা তা নির্ধারণ করতে, সাফল্যের সাথে স্থানান্তর করতে আরও ডেটা প্রয়োজন। যেমন:

আমি যে বিকল্পটির কথা ভাবছিলাম তা হ'ল ফাইলটি একটি আলাদা ফাইল এক্সটেনশন (পছন্দ করা .tar.gz.part) হিসাবে অনুলিপি করা হবে এবং তারপরে .tar.gzস্থানান্তর সম্পূর্ণ হওয়ার পরে নতুন নামকরণ করা হবে ।

ফাইলটি সম্পূর্ণরূপে এবং সাফল্যের সাথে স্থানান্তরিত হয়েছে এমন যোগাযোগের এটি একটি দুর্দান্ত উপায়। আপনি একই ফাইল সিস্টেমের মধ্যে থাকা পর্যন্ত একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে ফাইলগুলি স্থানান্তর করতে পারেন। অথবা প্রেরককে filename.doneসম্পূর্ণরূপে সংকেত দেওয়ার জন্য একটি খালি ফাইল প্রেরণ করুন।

তবে সমস্ত পদ্ধতির কোনওভাবে প্রেরকের উপর নির্ভর করতে হবে যে স্থানান্তরটি সফলভাবে সম্পন্ন হয়েছে sign কারণ কেবল প্রেরকের কাছে সেই তথ্য রয়েছে।

কিছু ফাইল ফর্ম্যাট (যেমন পিডিএফ) এর মধ্যে ডেটা থাকে যা আপনাকে ফাইলটি সম্পূর্ণ কিনা তা নির্ধারণ করতে দেয়। তবে আপনাকে পুরো ফাইলটি খুলতে এবং পড়তে হবে read

lsofকেবলমাত্র আপনাকে বলবে যে ফাইলটি আর খোলা নেই - এটি আপনাকে আর বলবে না কেন এটি আর খোলা নেই। কিংবা ফাইলটি কত বড় হওয়ার কথা তাও আপনাকে জানায় না।


1
আমি এটি যথেষ্ট upvote করতে পারবেন না। এখানে এক্সওয়াই সমস্যা সমাধানের জন্য ভাল কাজ।
গরুর মাংস

5

এটি করার সর্বোত্তম উপায় হ'ল ইনক্রন ("ইনোটাইফাই ক্রোন সিস্টেম") ব্যবহার করা। এটি আপনাকে ডিরেক্টরিতে একটি ইনোটিফাই ওয়াচ সেট করতে দেয় যা তারপরে আপনাকে ফাইল অপারেশন সম্পর্কে অবহিত করবে। এই ক্ষেত্রে, আপনার একটি ঘনিষ্ঠ লেখার জন্য দির দেখতে হবে। লেখার পরে ফাইলটি বন্ধ হয়ে যাওয়ার পরে এটি আপনাকে আপনার কমান্ড চালাতে দেয়।


2

দেখে মনে হচ্ছে যে lsof সনাক্ত করতে পারে যে কোনও মোডের অধীনে কোন ফাইলটি খোলা রয়েছে:

lsof -f -- a_file
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
cat     52391 bob    1w   REG    1,2       15 19545007 a_file

দেখুন কোথায় এটা 1W? তার মানে ফাইল বর্ণনাকারী নম্বরটি 1 এবং মোডটি ডাব্লু, বা লিখুন।


FDক্ষেত্র শো 3rআমার জন্য কখন ফাইলটি পড়ার জন্য খোলা আছে।
সোপালাজো ডি অ্যারিরেজ

0

inotifywaitআপনি যা পরে তা ব্যবহার করে তা অর্জন করতে পারে - কমান্ড কার্যকর করার আগে কোনও ফাইল রাইটিং শেষ না হওয়া পর্যন্ত অপেক্ষা করার সক্ষমতা রয়েছে।

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

WATCH_DIR=/directory/to/monitor
DEST_DIR=/x/y/z

/usr/bin/inotifywait --recursive --monitor --quiet -e moved_to -e close_write --format '%w%f' "$WATCH_DIR" | while read -r INPUT_FILE; do

mv "$0" "$DEST_DIR"

done

আরও কনফিগারেশন বিকল্পের জন্য https://linux.die.net/man/1/inotifywatch দেখুন

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