থেকে lsof
man পৃষ্ঠা
কমান্ডের নাম, ফাইলের নাম, ইন্টারনেট ঠিকানা বা ফাইল, লগইন নাম, এনএফএস ফাইল, পিআইডি, পিজিআইডি, বা ইউআইডি তালিকাভুক্ত করতে বলা হয়েছিল এমন কোনও ত্রুটি সনাক্ত করা থাকলে 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
।