ইউনিক্সে "পাঠ্য ফাইল ব্যস্ত" বার্তাটি কী উত্পন্ন করে?


137

"টেক্সট ফাইল ব্যস্ত" ত্রুটিটি কী অপারেশন তৈরি করে? আমি ঠিক বলতে পারছি না।

আমি মনে করি এটি এর সাথে সম্পর্কিত যে আমি একটি অস্থায়ী পাইথন স্ক্রিপ্ট তৈরি করছি (টেম্পাইল ব্যবহার করে) এবং এটি থেকে এক্সেল ব্যবহার করছি তবে আমি মনে করি যে এক্সিকিউট ফাইলটি চালিত হওয়াতে পরিবর্তন করে।

উত্তর:


130

এই ত্রুটিটির অর্থ অন্য কোনও প্রক্রিয়া বা ব্যবহারকারী আপনার ফাইলটি অ্যাক্সেস করছে। ব্যবহার করুন lsofকি প্রক্রিয়া এটি ব্যবহার করা হয় বার করো। killপ্রয়োজনে কমান্ড ব্যবহার করে এটি হত্যা করতে পারেন।


115
Text file busyনির্দিষ্ট ত্রুটি সময় নির্বাহ করা হয় একটি এক্সিকিউটেবল সংশোধন করতে চেষ্টা সম্পর্কে। "পাঠ্য" এখানে বোঝায় যে ফাইলটি সংশোধন করা হচ্ছে একটি চলমান প্রোগ্রামের পাঠ্য বিভাগ । এটি একটি খুব বিশেষ কেস এবং আপনার জবাবটি যে জেনেরিক বলে মনে হচ্ছে তা নয়। তবুও, আপনার উত্তর সম্পূর্ণ ভুল নয়।
অর্জুনশঙ্কর

4
মন্তব্য সহ উত্তর সম্পূর্ণ বলে মনে হচ্ছে।
Penz

ওপি জিজ্ঞাসা করেছিল যে কোন অপারেশন ত্রুটিটি উত্পন্ন করে, ত্রুটিটির অর্থ কী তা বোঝানোর জন্য নয়।
ওয়ান্ডার ওয়ার্কার

আমি মনে করি যে ইউনিক্স ফাইলগুলি "পাঠ্য ফাইল" হিসাবে ধারণ করে তা আয়াতাত্বিক, আমার ক্ষেত্রে এটি একটি বাইনারি ফাইল ছিল যা এই ত্রুটিটি উত্সাহিত করেছিল।
ফিলিপ ভাল্ডেস

1
@ ফিলিপওয়াল্ডেস অর্ধ শতাব্দী আগের শব্দটির নামটি historicalতিহাসিক। উদাহরণস্বরূপ, মাল্টিক্সে কোনও প্রোগ্রামের পাঠ্য বিভাগটি লিংক বিভাগের থেকে পৃথক ছিল এবং এমনকি এর আগেও লোকেরা বাইনারি পাঠ্য সম্পর্কে কথা বলেছিল। stackoverflow.com/a/1282540/833300
jma

30

আমি সেই বার্তাটি দেখেছি এটির বেশ কিছুক্ষণ পরে এটি সিস্টেম ভি আর 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

আমি আধুনিক সিস্টেমে ত্রুটিটি বেশ কিছুক্ষণ দেখিনি ... তবে আমি প্রায়শই নিজেকে পুনর্নির্মাণ করার প্রোগ্রামগুলি করি না।


3
এখানে একটি সুপার দ্রুত বংশবৃদ্ধিকারক আছে: 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': ব্যস্ত পাঠ্য ফাইল তৈরি করা যায় না" ত্রুটি বার্তাটি উত্পন্ন হয়েছে।
অর্জুনশঙ্কর

3
অবশ্যই, এই উত্তরটি সঠিক এবং একটি +1 পেয়েছে। আপনি অস্বীকারটিকে "এটি কিছুক্ষণ হয়ে গেছে" মুছে ফেলতে চাইতে পারেন।
অর্জুনশঙ্কর

@ArjunShankar এখানে "সরাসরি" সিস্টেম কলের মাধ্যমে একটি আধুনিক লিনাক্স একটি সি প্রজনন হল: stackoverflow.com/questions/16764946/... জিসিসি শুধুমাত্র ঊর্ধ্বলিপি আজকাল এক্সেকিউটেবল চলমান পারবেন না কারণ প্রথমে একটি হলে unlinkডিফল্টরূপে।
সিওরো সান্তিলি 郝海东 冠状 病 六四 事件

14

কার্নেল দ্বারা বর্তমানে সম্পাদিত একটি ফাইলের জন্য যখন আপনি চেষ্টা ও লেখার চেষ্টা করেন বা বর্তমানে লেখার জন্য উন্মুক্ত একটি ফাইল কার্যকর করেন তখন এটি ঘটে থাকে।

সূত্র: http://wiki.wlug.org.nz/ETXTBSY


6

ন্যূনতম চলমান সি পসিক্স প্রজননের উদাহরণ

কী চলছে তা আরও ভাল করে দেখার জন্য আমি অন্তর্নিহিত এপিআই বোঝার প্রস্তাব দিই।

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

পথের নামটি একটি কার্যকরযোগ্য চিত্রকে বোঝায় যা বর্তমানে কার্যকর করা হচ্ছে এবং লেখার অ্যাক্সেসের জন্য অনুরোধ করা হয়েছিল।


1
লিঙ্কমুক্ত করার ক্ষেত্রে যুক্তিটি হ'ল ফাইলটি সেই ডিরেক্টরি থেকে আর অ্যাক্সেসযোগ্য নয়, তবে ইনোডটি এখনও একটি পুনঃকাউন্ট>> 0 সহ রয়েছে you আপনি যদি নামটি পুনরায় ব্যবহার করেন তবে এটি একটি নতুন ইনোডে একটি নতুন ফাইল - যেখানে যদি আপনি প্রথমে লিঙ্কমুক্ত করবেন না, আপনি আসলে সুরক্ষিত ইনোডে লেখার চেষ্টা করছেন।
পেনজ

মন্তব্যের জন্য পেনজ ওব্রিগো, লেয়ানড্রো। আমিও ভাবছি কেন বিপরীতভাবে, আপনি যদি লেখার চেষ্টা না করে তবে এটি ত্রুটি দেয় unlink। লিনাক্স কি কখনও প্রথম execকল করার পরে ফাইলটি একাধিকবার পড়তে পারে?
সিরো সান্তিলি :25 冠状 病 六四 事件 法轮功

ETXTBSY কী তৈরি করছে তা হ'ল ইনোড সুরক্ষা। আনলিংক ছাড়াই, কোনও লেখক ফাইলের প্রয়োগ দ্বারা সুরক্ষিত ইনোডে যান; লিঙ্কমুক্ত করে, আপনি একটি নতুন ইনোড পাবেন যা সুরক্ষিত নয়। (নিশ্চিত নয় যে "সুরক্ষিত" এখানে শব্দটি, তবে এটি ধারণা)
Penz

5

আমার ক্ষেত্রে, আমি একটি সিএস এনভায়রনমেন্টে একটি শেল ফাইল (একটি এক্সটেনশন .sh সহ) চালানোর চেষ্টা করছিলাম এবং আমি সেই ত্রুটি বার্তা পাচ্ছি।

শুধু বাশ দিয়ে দৌড়ানো আমার জন্য এটি কাজ করেছিল। উদাহরণ স্বরূপ

bash file.sh


1
এটি একটি #!/bin/bashশিরোনাম আছে?
Penz


আপনি চেষ্টা #!/usr/bin/cshবা সমতুল্য চেষ্টা করতে চাইতে পারেন ।
Penz

3

যদি phpredisকোনও লিনাক্স বাক্সে নির্মাণের চেষ্টা করা হয় sleepতবে ফাইল চালানোর আগে আপনাকে একটি আদেশ দিয়ে ফাইল অনুমতিগুলি সংশোধন করার জন্য সময় দিতে হবে :

chmod a+x /usr/bin/php/scripts/phpize \
  && sleep 1 \
  && /usr/bin/php/scripts/phpize

chmodঅনুমতিগুলি নির্ধারিত হওয়ার আগে ফিরে আসবে বলে আমি মনে করি না । এটি একটি ফাইল সিস্টেমের সমস্যা হতে পারে।
Penz

এটি একটি ডকার চিত্র তৈরি হওয়ার অভ্যন্তরে ঘটেছে।
স্টিফেন

1
ডকারের একাধিক স্টোরেজ ড্রাইভার রয়েছে, আমি অনুমান করি যে এগুলি সবই নিখুঁত।
Penz

তবুও, ডকার ইমেজ তৈরি করার সময় লোকেরা এই সমস্যাটি অনুভব করে এটি খুব ভাল ইঙ্গিত।
ম্যাকিয়েজ গোল

2

কারণটি জানেন না তবে আমি দ্রুত এবং সহজ কাজের জন্য অবদান রাখতে পারি।

আমি "বিড়াল> shScript.sh" (পেস্ট, ^ Z) এর পরে কে-রাইটে ফাইলটি সম্পাদনা করার পরে সেন্টোজ 6 এ এই অদ্ভুততাটি কেবল অনুভব করেছি। অদ্ভুতভাবে স্ক্রিপ্টটি কার্যকর করার কোনও বোধগম্য উদাহরণ নেই (পিএস-শেফ)।

আমার দ্রুত কাজটি কেবল "সিপি shScript.sh shScript2.sh" এ ছিল তখন আমি shScript2.sh সম্পাদন করতে সক্ষম হয়েছি। তারপরে আমি দুজনেই মুছে ফেললাম। সম্পন্ন!


আপনার সমস্যাটি কারণ আপনি প্রক্রিয়াটি স্থগিত করেছেন cat। পরের বার ^ Z ব্যবহার না করে ^ D ব্যবহার করুন।
ভ্লাদিমির পানতেলিভ

বেশ ডান ভ্লাদিমির। ধন্যবাদ! আমি ডস / সিএমডি প্রম্পটে এটি করতাম। পুরানো অভ্যাস ... যেহেতু ঘটেনি :)
স্কটওলকার

2

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


2

আপনি যদি মোবাএক্সটার্মের মতো কোনও সরঞ্জামের সাথে এসএসএস সংযোগ থেকে .sh চালাচ্ছেন এবং যদি বলে যে সরঞ্জামটির স্থানীয় মেশিন থেকে রিমোট ফাইল সম্পাদনা করার জন্য একটি অটোসভেভ ইউটিলিটি রয়েছে, তবে ফাইলটি লক হয়ে যাবে।

এসএসএইচ অধিবেশন বন্ধ এবং পুনরায় খোলা এটি সমাধান করে।


1

আমার একটি অভিজ্ঞতা:

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

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)

0

পিএইচপি- fopen()তে কোনও ফাইল ব্যবহার করার সময় এবং তারপরে unlink()এটি ব্যবহার fclose()করার আগে চেষ্টা করার সময় আমি এটি পেরিয়ে এসেছি ।

ভাল না:

$handle = fopen('file.txt');
// do something
unlink('file.txt');

ভাল:

$handle = fopen('file.txt');
// do something
fclose($handle);
unlink('file.txt');

উইন্ডোজ আমি অনুমান? লিনাক্সে সিস্টেমটি সাধারণত আমাদের খোলা ফাইলগুলি মুছতে সক্ষম করে - ডিরেক্টরিতে রেফারেন্সটি মুছে ফেলা হয়, তবে তথ্যগুলি (ইনোড) তখনই ফ্রেড হয় যখন রেফারেন্সের সংখ্যা 0 পৌঁছায়
Penz

না, এটি সেন্টোসে ছিল।
dtbarne

এটি লিনাক্স 4.7.10 এ এক্সট 4 ফাইল সিস্টেমের সাথে পরীক্ষা করেছে এবং এটি কোনও ত্রুটি তৈরি করতে পারে নি, পেনজ উল্লিখিত হিসাবে কাজ করেছে। ফাইল সফলভাবে মোছা হয়েছে। হতে পারে ডিটিবার্ন কিছু বিশেষ ফাইল সিস্টেম ব্যবহার করছে।
k3a 20

এটি অসম্পূর্ণ উপর চালাচ্ছিল - এটি ভাগ করা ফোল্ডার হওয়ার কারণে হতে পারে।
dtbarne

0
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

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