উত্তর:
এই ত্রুটিটির অর্থ অন্য কোনও প্রক্রিয়া বা ব্যবহারকারী আপনার ফাইলটি অ্যাক্সেস করছে। ব্যবহার করুন lsof
কি প্রক্রিয়া এটি ব্যবহার করা হয় বার করো। kill
প্রয়োজনে কমান্ড ব্যবহার করে এটি হত্যা করতে পারেন।
আমি সেই বার্তাটি দেখেছি এটির বেশ কিছুক্ষণ পরে এটি সিস্টেম ভি আর 3 তে প্রচলিত ছিল বা কয়েক দশক আগে এটি ভাল ছিল। তারপরে, এর অর্থ হ'ল আপনি যখন চালানো চলাকালীন কোনও এক্সিকিউটেবল প্রোগ্রাম পরিবর্তন করতে পারবেন না।
উদাহরণস্বরূপ, আমি একটি make
ওয়ার্কালিকে নামক বিল্ডিং তৈরি করছিলাম যা rmk
কিছুক্ষণ পরে স্ব-রক্ষণাবেক্ষণের কাজ করেছিল। আমি ডেভলপমেন্ট ভার্সনটি চালিত করব এবং এটি একটি নতুন সংস্করণ তৈরি করব। এটির কাজ পেতে, এটির কার্যকারিতাটি ব্যবহার করা দরকার:
gcc -g -Wall -o rmk1 main.o -L. -lrmk -L/Users/jleffler/lib/64 -ljl
if [ -f rmk ] ; then mv rmk rmk2 ; else true; fi ; mv rmk1 rmk
সুতরাং, 'পাঠ্য ফাইলের ব্যস্ততা' নিয়ে সমস্যা এড়াতে, বিল্ডটি একটি নতুন ফাইল তৈরি করেছে rmk1
, তারপরে পুরানোটিকে সরানো rmk
হয়েছে rmk2
(নাম পরিবর্তন করা কোনও সমস্যা ছিল না; লিঙ্কটি ছিল না), এবং তারপরে নতুন তৈরিটি সরানো rmk1
হয়েছে rmk
।
আমি আধুনিক সিস্টেমে ত্রুটিটি বেশ কিছুক্ষণ দেখিনি ... তবে আমি প্রায়শই নিজেকে পুনর্নির্মাণ করার প্রোগ্রামগুলি করি না।
echo -e '#include <unistd.h>\nint main(void){sleep (5);return 0;}' > slowprog.c && cc slowprog.c && cp a.out b.out && (./a.out &) ; sleep 1 && cp b.out a.out
। "সিপি: আমার নতুন ফেডোরায় নিয়মিত ফাইল 'a.out': ব্যস্ত পাঠ্য ফাইল তৈরি করা যায় না" ত্রুটি বার্তাটি উত্পন্ন হয়েছে।
unlink
ডিফল্টরূপে।
কার্নেল দ্বারা বর্তমানে সম্পাদিত একটি ফাইলের জন্য যখন আপনি চেষ্টা ও লেখার চেষ্টা করেন বা বর্তমানে লেখার জন্য উন্মুক্ত একটি ফাইল কার্যকর করেন তখন এটি ঘটে থাকে।
ন্যূনতম চলমান সি পসিক্স প্রজননের উদাহরণ
কী চলছে তা আরও ভাল করে দেখার জন্য আমি অন্তর্নিহিত এপিআই বোঝার প্রস্তাব দিই।
sleep.c
#define _XOPEN_SOURCE 700
#include <unistd.h>
int main(void) {
sleep(10000);
}
busy.c
#define _XOPEN_SOURCE 700
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void) {
int ret = open("sleep.out", O_WRONLY|O_TRUNC);
assert(errno == ETXTBSY);
perror("");
assert(ret == -1);
}
সংকলন এবং চালান:
gcc -std=c99 -o sleep.out ./sleep.c
gcc -std=c99 -o busy.out ./busy.c
./sleep.out &
./busy.out
busy.out
জমিদারি এবং perror
আউটপুট পাস :
Text file busy
সুতরাং আমরা অনুমান করি যে বার্তাটি কেবল গ্লিবসিতে হার্ডকোডযুক্ত।
বিকল্পভাবে:
echo asdf > sleep.out
বাশ আউটপুট তোলে:
-bash: sleep.out: Text file busy
আরও জটিল অ্যাপ্লিকেশনটির জন্য, আপনি এটি সহ এটিও পর্যবেক্ষণ করতে পারেন strace
:
strace ./busy.out
যেটা বহন করে:
openat(AT_FDCWD, "sleep.out", O_WRONLY) = -1 ETXTBSY (Text file busy)
উবুন্টু 18.04, লিনাক্স কার্নেল 4.15.0 এ পরীক্ষিত।
ত্রুটিটি যদি আপনি unlink
প্রথমে করেন না
notbusy.c:
#define _XOPEN_SOURCE 700
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void) {
assert(unlink("sleep.out") == 0);
assert(open("sleep.out", O_WRONLY|O_CREAT) != -1);
}
তারপরে উপরেরটি অনুসারে সংকলন করুন এবং চালনা করুন এবং সেগুলি দৃ pass়ভাবে পাস হয়।
এটি ব্যাখ্যা করে যে কেন এটি নির্দিষ্ট প্রোগ্রামগুলির জন্য কাজ করে তবে অন্যদের জন্য নয়। যেমন আপনি যদি:
gcc -std=c99 -o sleep.out ./sleep.c
./sleep.out &
gcc -std=c99 -o sleep.out ./sleep.c
এটি একটি ত্রুটি তৈরি করে না, যদিও দ্বিতীয় gcc
কলটি লিখিত হচ্ছে sleep.out
।
একটি তাড়াতাড়ি strace
দেখায় যে জিসিসি লেখার আগে প্রথমে লিঙ্কমুক্ত:
strace -f gcc -std=c99 -o sleep.out ./sleep.c |& grep sleep.out
রয়েছে:
[pid 3992] unlink("sleep.out") = 0
[pid 3992] openat(AT_FDCWD, "sleep.out", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
এটি ব্যর্থ না হওয়ার কারণটি হ'ল আপনি unlink
এবং ফাইলটি পুনরায় লেখার সময় এটি একটি নতুন ইনোড তৈরি করে এবং চলমান এক্সিকিউটেবল ফাইলের জন্য একটি অস্থায়ী ডাঙ্গালিং ইনোড রাখে।
তবে আপনি যদি এটি write
ছাড়াই থাকেন unlink
তবে এটি চলমান এক্সিকিউটেবলের মতো একই সুরক্ষিত ইনোডে লেখার চেষ্টা করে।
পজিক্স 7 open()
http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html
[ETXTBSY]
ফাইলটি একটি খাঁটি প্রক্রিয়া (ভাগ করা পাঠ্য) ফাইল যা কার্যকর করা হচ্ছে এবং অফলাগটি হল O_WRONLY বা O_RDWR।
মানুষ 2 খোলা
ETXTBSY
পথের নামটি একটি কার্যকরযোগ্য চিত্রকে বোঝায় যা বর্তমানে কার্যকর করা হচ্ছে এবং লেখার অ্যাক্সেসের জন্য অনুরোধ করা হয়েছিল।
unlink
। লিনাক্স কি কখনও প্রথম exec
কল করার পরে ফাইলটি একাধিকবার পড়তে পারে?
আমার ক্ষেত্রে, আমি একটি সিএস এনভায়রনমেন্টে একটি শেল ফাইল (একটি এক্সটেনশন .sh সহ) চালানোর চেষ্টা করছিলাম এবং আমি সেই ত্রুটি বার্তা পাচ্ছি।
শুধু বাশ দিয়ে দৌড়ানো আমার জন্য এটি কাজ করেছিল। উদাহরণ স্বরূপ
bash file.sh
#!/bin/bash
শিরোনাম আছে?
#!/usr/bin/csh
বা সমতুল্য চেষ্টা করতে চাইতে পারেন ।
যদি phpredis
কোনও লিনাক্স বাক্সে নির্মাণের চেষ্টা করা হয় sleep
তবে ফাইল চালানোর আগে আপনাকে একটি আদেশ দিয়ে ফাইল অনুমতিগুলি সংশোধন করার জন্য সময় দিতে হবে :
chmod a+x /usr/bin/php/scripts/phpize \
&& sleep 1 \
&& /usr/bin/php/scripts/phpize
chmod
অনুমতিগুলি নির্ধারিত হওয়ার আগে ফিরে আসবে বলে আমি মনে করি না । এটি একটি ফাইল সিস্টেমের সমস্যা হতে পারে।
কারণটি জানেন না তবে আমি দ্রুত এবং সহজ কাজের জন্য অবদান রাখতে পারি।
আমি "বিড়াল> shScript.sh" (পেস্ট, ^ Z) এর পরে কে-রাইটে ফাইলটি সম্পাদনা করার পরে সেন্টোজ 6 এ এই অদ্ভুততাটি কেবল অনুভব করেছি। অদ্ভুতভাবে স্ক্রিপ্টটি কার্যকর করার কোনও বোধগম্য উদাহরণ নেই (পিএস-শেফ)।
আমার দ্রুত কাজটি কেবল "সিপি shScript.sh shScript2.sh" এ ছিল তখন আমি shScript2.sh সম্পাদন করতে সক্ষম হয়েছি। তারপরে আমি দুজনেই মুছে ফেললাম। সম্পন্ন!
cat
। পরের বার ^ Z ব্যবহার না করে ^ D ব্যবহার করুন।
আপনি এটি সিআইএফএস / এসএমবি নেটওয়ার্ক শেয়ারগুলিতে বেশি সাধারণ বলে মনে করতে পারেন। অন্য কোনও ফাইল যখন ফাইলটি খোলা থাকে তখন উইন্ডোজ কোনও ফাইল লেখার অনুমতি দেয় না, এবং যদি পরিষেবাটি উইন্ডোজ নাও হয় (এটি অন্য কোনও এনএএস পণ্য হতে পারে) তবে এটি সম্ভবত একই আচরণ পুনরুত্পাদন করবে। সম্ভবত, এটি লকিং / প্রতিরূপ সম্পর্কিত অস্পষ্টভাবে কিছু অন্তর্নিহিত এনএএস ইস্যুর প্রকাশ হতে পারে of
আপনি যদি মোবাএক্সটার্মের মতো কোনও সরঞ্জামের সাথে এসএসএস সংযোগ থেকে .sh চালাচ্ছেন এবং যদি বলে যে সরঞ্জামটির স্থানীয় মেশিন থেকে রিমোট ফাইল সম্পাদনা করার জন্য একটি অটোসভেভ ইউটিলিটি রয়েছে, তবে ফাইলটি লক হয়ে যাবে।
এসএসএইচ অধিবেশন বন্ধ এবং পুনরায় খোলা এটি সমাধান করে।
আমার একটি অভিজ্ঞতা:
আমি সর্বদা বিপরীত ইঞ্জিনিয়ারিংয়ের মাধ্যমে ক্রোমের ডিফল্ট কীবোর্ড শর্টকাটটি পরিবর্তন করি। পরিবর্তনের পরে, আমি ক্রোম বন্ধ করতে ভুলে গিয়েছিলাম এবং নিম্নলিখিতগুলি চালিত করেছি:
sudo cp chrome /opt/google/chrome/chrome
cp: cannot create regular file '/opt/google/chrome/chrome': Text file busy
স্ট্রেস ব্যবহার করে আপনি আরও বিশদ জানতে পারবেন:
sudo strace cp ./chrome /opt/google/chrome/chrome 2>&1 |grep 'Text file busy'
open("/opt/google/chrome/chrome", O_WRONLY|O_TRUNC) = -1 ETXTBSY (Text file busy)
পিএইচপি- fopen()
তে কোনও ফাইল ব্যবহার করার সময় এবং তারপরে unlink()
এটি ব্যবহার fclose()
করার আগে চেষ্টা করার সময় আমি এটি পেরিয়ে এসেছি ।
ভাল না:
$handle = fopen('file.txt');
// do something
unlink('file.txt');
ভাল:
$handle = fopen('file.txt');
// do something
fclose($handle);
unlink('file.txt');
root@h1:bin[0]# mount h2:/ /x
root@h1:bin[0]# cp /usr/bin/cat /x/usr/local/bin/
root@h1:bin[0]# umount /x
...
root@h2:~[0]# /usr/local/bin/cat
-bash: /usr/local/bin/cat: Text file busy
root@h2:~[126]#
ubuntu 20.04, 5.4.0-40-generic
nfsd problem, after reboot ok
Text file busy
নির্দিষ্ট ত্রুটি সময় নির্বাহ করা হয় একটি এক্সিকিউটেবল সংশোধন করতে চেষ্টা সম্পর্কে। "পাঠ্য" এখানে বোঝায় যে ফাইলটি সংশোধন করা হচ্ছে একটি চলমান প্রোগ্রামের পাঠ্য বিভাগ । এটি একটি খুব বিশেষ কেস এবং আপনার জবাবটি যে জেনেরিক বলে মনে হচ্ছে তা নয়। তবুও, আপনার উত্তর সম্পূর্ণ ভুল নয়।