ফাইলটি সরান তবেই এটি বন্ধ থাকে


10

আমি বাহ্যিক প্রক্রিয়া দ্বারা নির্মিত বড় ফাইল এটি বন্ধ হওয়ার সাথে সাথেই স্থানান্তরিত করতে চাই।

এই পরীক্ষার আদেশটি কি সঠিক?

if lsof "/file/name"
then
        # file is open, don't touch it!
else
        if [ 1 -eq $? ]
        then
                # file is closed
                mv /file/name /other/file/name
        else
                # lsof failed for some other reason
        fi
fi

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


3
পার্শ্ব নোট: একবার একটি ফাইল খোলার পরে, প্রক্রিয়াগুলি ফাইল বর্ণনাকারী এবং এনিড ডেটা ব্যবহারের জন্য এটি ব্যবহার করে processes পাথ পরিবর্তন করা (অর্থাত্ ফাইলটি সরিয়ে নেওয়া) প্রক্রিয়াটিতে খুব বেশি সমস্যার সৃষ্টি করবে না।
জন ডব্লিউ এইচ স্মিথ

2
বাহ্যিক প্রক্রিয়াতে আপনার কি কোনও নিয়ন্ত্রণ আছে? বাহ্যিক প্রক্রিয়াটির জন্য কোনও অস্থায়ী ফাইল তৈরি করা এবং ফাইলটি লেখার কাজ শেষ হওয়ার পরে পুনরায় নামকরণ করা সম্ভব হবে?
জেনি ডি

@ জেনিডি আমি কিছু তদন্ত করেছি এবং এটি সত্য বলে প্রমাণিত হয়েছে। আমার মোটেই দরকার নেই lsofকেবল ফাইল এক্সটেনশনটি নেই কিনা তা খতিয়ে দেখার দরকার আমার .tmp। এটি একেবারে তুচ্ছ করে তোলে। তবে আমি আনন্দিত আমি আমার প্রশ্ন জিজ্ঞাসা যেহেতু আমি সম্পর্কে একটু শিখেছি আছি lsofএবং inotifyএবং স্টাফ।
পিটার কোভাক

@ পিটারকোভাক উত্তরগুলি পড়া থেকে আমি তাদের সম্পর্কে আরও শিখলাম, সুতরাং আপনি এটি জিজ্ঞাসা করে আমি খুব আনন্দিত।
জেনি ডি

@ জোহানডাব্লুএইচএসমিথ - একই ফাইল সিস্টেমের মধ্যে ফাইলটি সরিয়ে ফেললে সাধারণত এটি সত্য হয়, যদি লেখক লেখার আগে এটি ফাইলটি কোনও নতুন ফাইল সিস্টেমে নিয়ে যায় তবে সে কিছু তথ্য হারাবে।
জনি 20

উত্তর:


11

থেকে lsofman পৃষ্ঠা

কমান্ডের নাম, ফাইলের নাম, ইন্টারনেট ঠিকানা বা ফাইল, লগইন নাম, এনএফএস ফাইল, পিআইডি, পিজিআইডি, বা ইউআইডি তালিকাভুক্ত করতে বলা হয়েছিল এমন কোনও ত্রুটি সনাক্ত করা থাকলে Lsof একটি (1) প্রদান করে। যদি -V বিকল্পটি নির্দিষ্ট করা থাকে তবে lsof অনুসন্ধান আইটেমগুলিকে এটি তালিকাভুক্ত করতে ব্যর্থ করে।

সুতরাং এটি আপনাকে বোঝায় যে আপনার lsof failed for some other reasonধারাটি কখনই কার্যকর করা হবে না।

আপনার বাহ্যিক প্রক্রিয়াটি এখনও খোলার সময় আপনি কি কেবল ফাইলটি সরানোর চেষ্টা করেছেন? গন্তব্য ডিরেক্টরি যদি একই ফাইল সিস্টেমে থাকে তবে তৃতীয় প্রক্রিয়া থেকে মূল পাথের অধীনে অ্যাক্সেস করার প্রয়োজন না হলে যদি অন্তর্নিহিত ইনোড একই থাকে। অন্যথায় আমি mvযাই হোক না কেন ব্যর্থ হবে বলে মনে করি ।

আপনার বাহ্যিক প্রক্রিয়াটি ফাইলটি শেষ না হওয়া পর্যন্ত যদি সত্যিই অপেক্ষা করতে হয়, আপনি বার বার ভোট দেওয়ার পরিবর্তে একটি কমান্ড ব্যবহার করা ভাল। লিনাক্সে, আপনি এটির inotifywaitজন্য ব্যবহার করতে পারেন । উদাহরণ:

 inotifywait -e close_write /path/to/file

যদি আপনার অবশ্যই ব্যবহার করা হয় lsof(সম্ভবত বহনযোগ্যতার জন্য) তবে আপনি এরকম কিছু চেষ্টা করতে পারেন:

until err_str=$(lsof /path/to/file 2>&1 >/dev/null); do
  if [ -n "$err_str" ]; then
    # lsof printed an error string, file may or may not be open
    echo "lsof: $err_str" >&2

    # tricky to decide what to do here, you may want to retry a number of times,
    # but for this example just break
    break
  fi

  # lsof returned 1 but didn't print an error string, assume the file is open
  sleep 1
done

if [ -z "$err_str" ]; then
  # file has been closed, move it
  mv /path/to/file /destination/path
fi

হালনাগাদ

নীচে @ জন ডাব্লুএইচএসমিথ দ্বারা উল্লিখিত হিসাবে , নিরাপদ নকশায় সর্বদা lsofউপরের মতো একটি লুপ ব্যবহার করা সম্ভব হবে কারণ এটি সম্ভব যে একাধিক প্রক্রিয়াতে ফাইল লেখার জন্য উন্মুক্ত থাকে (উদাহরণস্বরূপ একটি দুর্বল লিখিত ইনডেক্সিং ডিমন হতে পারে যা পাঠকের সাথে ফাইলগুলি খোলায় / যখন পতাকাটি সত্যই কেবল পঠন করা উচিত) লিখুন। inotifywaitএখনও ঘুমের পরিবর্তে ব্যবহার করা যেতে পারে, কেবল স্লিপ লাইনটি প্রতিস্থাপন করুন inotifywait -e close /path/to/file


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

1
অন্য পক্ষের নোট: inotifywaitস্ক্রিপ্টটি দুটি "পোলিং" থেকে প্রায়শই আটকাতে পারে, ওপিতে এখনও lsofএকটি লুপটি পরীক্ষা করা দরকার : ফাইলটি দু'বার খোলা থাকলে, একবার বন্ধ হয়ে গেলে inotifyঘটনাটি ট্রিগার করতে পারে , যদিও ফাইলটি প্রস্তুত না হলেও কারসাজি করা (উদাহরণস্বরূপ, কোডের শেষ স্নিপেটে, আপনার sleepকলটি প্রতিস্থাপন করা যেতে পারে inotifywait)।
জন ডব্লিউ এইচ স্মিথ

@ জন একটি close_writeঠিক করা উচিত যেহেতু একবারে কেবল একটি প্রক্রিয়াতে ফাইল লেখার জন্য উন্মুক্ত থাকতে পারে। এটি ধরে নেওয়া হয় যে এটি বন্ধ হওয়ার পরে অন্য কেউ সরাসরি এটি খুলবে না, তবে lsofভোট দেওয়ার ক্ষেত্রে একই সমস্যা বিদ্যমান ।
গ্রামীণ

1
@ গ্র্যামিম ওপির ক্ষেত্রে ডিজাইনের মাধ্যমে এটি সত্য হতে পারে, কার্নেল লেখার জন্য একটি ফাইল দু'বার খোলার অনুমতি দেয় (যার ক্ষেত্রে, CLOSE_WRITEদুবার ট্রিগার করা হয়)।
জন ডব্লিউ এইচ স্মিথ

@ জন আপডেট হয়েছে
গ্রামীণ

4

বিকল্প পদ্ধতির হিসাবে এটি কোনও পাইপের ক্ষেত্রে উপযুক্ত কেস - দ্বিতীয় প্রক্রিয়াটি সম্পূর্ণ প্রক্রিয়াটি শেষ হওয়ার অপেক্ষা না করেই প্রথম প্রসেসটি উপলব্ধ হওয়ার সাথে সাথেই আউটপুট প্রক্রিয়া করবে:

process1 input_file.dat | process2 > output_file.dat

সুবিধাদি:

  • সাধারণভাবে অনেক দ্রুত:
    • ডিস্ক থেকে লিখতে এবং পড়তে হবে না (আপনি যদি র‌্যামডিস্ক ব্যবহার করেন তবে এটি এড়ানো যেতে পারে)।
    • আরও সম্পূর্ণরূপে মেশিনের সংস্থানগুলি ব্যবহার করা উচিত।
  • সমাপ্তির পরে অপসারণের জন্য কোনও মধ্যবর্তী ফাইল নেই।
  • কোনও জটিল লকিংয়ের দরকার নেই, যেমনটি ওপি।

আপনার যদি সরাসরি পাইপ তৈরির উপায় না থাকে তবে আপনার কাছে জিএনইউ কোর্টিল রয়েছে আপনি এটি ব্যবহার করতে পারেন:

tail -F -n +0 input_file.dat | process2 > output_file.dat

এটি প্রথম থেকেই ইনপুট ফাইলটি পড়া শুরু করবে, ফাইলটি লেখার মাধ্যমে প্রথম প্রক্রিয়াটি কতটা দূরে থাকুক না কেন (এটি এখনও শুরু হয়নি বা ইতিমধ্যে শেষ না হলেও)।


হ্যাঁ, এটিই হবে "সুস্পষ্ট" সমাধান। দুর্ভাগ্যক্রমে, ডেটা উত্পাদন প্রক্রিয়াটি আমার নিয়ন্ত্রণের বাইরে (অন্য ব্যবহারকারীর দ্বারা চালিত)।
পিটার কোভাক

@ পিটারকোভাক এটি অপ্রাসঙ্গিক: বিড়াল ইনপুট_ফিল.ড্যাট | প্রক্রিয়া 2 আউটপুট_ফিল.ড্যাট
মারিয়াসম্যাটুটিয়

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