আপনি একটি দ্রুত ফিক্সের নিচে সমস্ত উপায়ে যেতে পারেন তবে এটি সর্বোত্তম বিকল্প নয়। তাই আমি প্রথমে এই সমস্ত পড়ার পরামর্শ দিচ্ছি।
rc.local
ত্রুটিগুলি সহ্য করে না
rc.local
বুদ্ধি করে ত্রুটিগুলি থেকে পুনরুদ্ধার করার কোনও উপায় সরবরাহ করে না। কোনও কমান্ড ব্যর্থ হলে এটি চলমান বন্ধ করে দেয়। প্রথম লাইনটি, পতাকাটির #!/bin/sh -e
সাথে চালিত শেলের মধ্যে এটি সম্পাদন করে -e
। -e
পতাকা কি একটি স্ক্রিপ্ট তোলে (এই ক্ষেত্রে, হয় rc.local
) প্রথমবার কমান্ড এটা মধ্যে ব্যর্থ চলমান থামাতে।
আপনি rc.local
এইরকম আচরণ করতে চান যদি কোনও কমান্ড ব্যর্থ হয়, আপনি চান না যে এটি শুরু হওয়ার সাথে সাথে অন্য যে কোনও প্রারম্ভিক কমান্ড এটির উপর নির্ভর করে চলেছে with
সুতরাং যদি কোনও কমান্ড ব্যর্থ হয়, পরবর্তী কমান্ডগুলি চলবে না। এখানে সমস্যাটি হ'ল এটি /script.sh
চালানো হয়নি (এটি ব্যর্থ হয়নি, নীচে দেখুন), সুতরাং এটি ব্যর্থ হওয়ার আগে সম্ভবত কিছু কমান্ড। তবে কোনটি?
এটা ছিল /bin/chmod +x /script.sh
?
না।
chmod
যে কোনও সময় ঠিক আছে। প্রদত্ত ফাইল-সিস্টেম যেটি /bin
মাউন্ট করা ছিল, আপনি চালাতে পারেন /bin/chmod
। এবং রান /bin
আগে মাউন্ট করা হয় rc.local
।
যখন রুট হিসাবে চালানো হয়, /bin/chmod
খুব কমই ব্যর্থ হয়। এটিতে চালিত ফাইলটি কেবল পঠনযোগ্য হলে এটি ব্যর্থ হবে এবং এটির মধ্যে থাকা ফাইল সিস্টেমটি অনুমতিগুলি সমর্থন না করলে ব্যর্থ হতে পারে। না হয় সম্ভবত এখানে।
উপায় দ্বারা, sh -e
হয় শুধুমাত্র কারণ এটি আসলে একটি সমস্যা হয়ে দাঁড়াবে কিনা chmod
ব্যর্থ হয়েছে। আপনি যখন কোনও স্ক্রিপ্ট ফাইল স্পষ্টভাবে তার দোভাষীকে অনুরোধ করে চালনা করেন, তখন ফাইলটি সম্পাদনযোগ্য হিসাবে চিহ্নিত কিনা তাতে কিছু আসে যায় না। এটি যদি বলে তবেই /script.sh
ফাইলটির নির্বাহযোগ্য বিট ব্যাপার। যেহেতু এটি বলে sh /script.sh
, এটি না (অবশ্যই /script.sh
নিজেরাই কল না করে) এটি চালানোর সময় না, যা কার্যকর হতে না পারায় এটি ব্যর্থ হতে পারে, তবে এটি নিজেকে কল করার সম্ভাবনা কম)।
তাহলে কি ব্যর্থ?
sh /home/incero/startup_script.sh
ব্যর্থ. প্রায় অবশ্যই.
আমরা জানি এটি দৌড়েছে, কারণ এটি ডাউনলোড হয়েছে /script.sh
।
(অন্যথায়, এটি চালানো হয়েছে কিনা তা নিশ্চিত করা গুরুত্বপূর্ণ, যদি কোনওরকম PATH/bin
তে না থাকে - আপনি লগ ইন করার সময় আপনার কাছে যেমন ছিল তা অগত্যা নয় If যদি পথে না থাকতেন তবে এটি করতে হবে হিসাবে চালানো হবে । যেহেতু এটি চালানোর করেছিলেন রয়েছে , যার মানে আপনি অন্যান্য কমান্ডের যে মধ্যে অবস্থিত হয় চালাতে পারেন সম্পূর্ণরূপে তাদের নাম কোয়ালিফাইং ছাড়াই। উদাহরণস্বরূপ, আপনি শুধু চালাতে পারেন বদলে । যাইহোক, আপনার শৈলী সঙ্গে পালন ইন , আমি সমস্ত কমান্ডের জন্য পুরোপুরি যোগ্য নামগুলি ব্যবহার করেছি , যখনই আমি আপনাকে এটি চালানোর পরামর্শ দিই))rc.local
PATH
/bin
rc.local
sh
/bin/sh
/bin
PATH
/bin
chmod
/bin/chmod
rc.local
sh
আমরা নিশ্চিত হতে পারি যে /bin/chmod +x /script.sh
কখনই দৌড়ায় নি (বা আপনি দেখতে পাবেন এটি /script.sh
কার্যকর হয়েছিল)। এবং আমরা জানিsh /script.sh
চালানো হয় না।
তবে এটি ডাউনলোড হয়েছে /script.sh
। সফল! কিভাবে এটি ব্যর্থ হতে পারে?
সাফল্যের দুটি অর্থ
কোনও আদেশ দুটি সফল হতে পারে যখন সে বলতে পারে কোনও আদেশ সফল হয়েছে:
- এটি আপনি যা করতে চেয়েছিলেন তা করেছে।
- এটি রিপোর্ট করেছে যে এটি সফল হয়েছে।
এবং তাই এটি ব্যর্থতার জন্য। কোনও ব্যক্তি যখন বলে যে কোনও আদেশ ব্যর্থ হয়েছে, তখন এর অর্থ হতে পারে:
- এটি আপনি যা করতে চেয়েছিলেন তা করে নি।
- এটি রিপোর্ট করেছে যে এটি ব্যর্থ হয়েছে।
sh -e
যেমন চালানো কোনও স্ক্রিপ্ট rc.local
প্রথমবারের মতো কোনও কমান্ডের ব্যর্থতার রিপোর্টে চালানো বন্ধ করে দেয় । কমান্ডটি আসলে কী করেছিল তাতে কোনও পার্থক্য নেই।
startup_script.sh
ব্যর্থতা রিপোর্ট করার উদ্দেশ্যে না করা ব্যতীত এটি যখন যা চায় তা করে, এটি একটি বাগ startup_script.sh
।
- কিছু বাগ কোনও স্ক্রিপ্টটি আপনি যা করতে চান তা করতে বাধা দেয়। প্রোগ্রামাররা এর পার্শ্ব প্রতিক্রিয়াগুলি কী বলে তা তারা প্রভাবিত করে ।
- এবং কিছু বাগ কোনও স্ক্রিপ্ট সফল হয়েছে কিনা তা সঠিকভাবে রিপোর্ট করতে বাধা দেয়। তারা প্রোগ্রামাররা তার রিটার্নের মানটিকে কী বলে তা প্রভাবিত করে (এই ক্ষেত্রে এটি একটি প্রস্থান স্থিতি )।
এটি ব্যর্থ হয়েছে যে রিপোর্ট করা বাদেstartup_script.sh
এটি সম্ভবত যা করা উচিত সব কিছু করেছিল ।
সাফল্য বা ব্যর্থতা কীভাবে প্রতিবেদন করা হয়
স্ক্রিপ্ট শূন্য বা আরও কমান্ডের তালিকা। প্রতিটি কমান্ডের একটি প্রস্থান স্থিতি রয়েছে। ধরে নিই যে স্ক্রিপ্টটি চালাতে আসলে কোনও ব্যর্থতা নেই (উদাহরণস্বরূপ, দোভাষী যদি স্ক্রিপ্টটি চালনার সময় পরবর্তী লাইনটি পড়তে না পারেন), কোনও স্ক্রিপ্টের প্রস্থান স্থিতিটি হ'ল:
0
(সাফল্য) স্ক্রিপ্টটি ফাঁকা থাকলে (যেমন কোনও আদেশ ছিল না)।
N
যদি স্ক্রিপ্ট কমান্ডের ফলে শেষ পর্যন্ত , যেখানে কিছু প্রস্থান কোড।exit N
N
- স্ক্রিপ্টে চলমান শেষ কমান্ডের প্রস্থান কোড otherwise
যখন একটি কার্যকর কার্যকর হয়, এটি তার নিজস্ব প্রস্থান কোডের প্রতিবেদন করে - এগুলি কেবল স্ক্রিপ্টগুলির জন্য নয়। (এবং প্রযুক্তিগতভাবে, স্ক্রিপ্টগুলি থেকে বেরিয়ে আসা কোডগুলি হ'ল চালানো শেলগুলি দ্বারা ফেরত প্রস্থান কোডগুলি))
উদাহরণস্বরূপ, যদি কোনও সি প্রোগ্রামটি শেষ হয় exit(0);
, বা return 0;
তার main()
কার্যক্রমে, কোডটি 0
অপারেটিং সিস্টেমকে দেওয়া হয়, যা এটি কলিং প্রক্রিয়াতে সরবরাহ করে (যা উদাহরণস্বরূপ, প্রোগ্রামটি চালানো শেল হতে পারে)।
0
মানে প্রোগ্রাম সফল হয়েছে। অন্যান্য প্রতিটি সংখ্যা মানে এটি ব্যর্থ। (এইভাবে, বিভিন্ন সংখ্যা প্রোগ্রামটি ব্যর্থ হওয়ার কারণে বিভিন্ন ক্ষেত্রে উল্লেখ করতে পারে))
কমান্ড মিট টু ব্যর্থ
কখনও কখনও, আপনি ব্যর্থ হবে এই অভিপ্রায় সহ একটি প্রোগ্রাম চালান। এই পরিস্থিতিতে, আপনি এটির ব্যর্থতা সাফল্য হিসাবে ভাবতে পারেন, যদিও এটি কোনও প্রোগ্রাম নয় যে প্রোগ্রামটি ব্যর্থতার রিপোর্ট করে। উদাহরণস্বরূপ, আপনি rm
যে ফাইলটি সন্দেহ করেছেন যে এটি ইতিমধ্যে বিদ্যমান নেই কেবলমাত্র তা মুছে ফেলা হয়েছে তা নিশ্চিত করতে আপনি এটি ব্যবহার করতে পারেন।
startup_script.sh
এটি চলমান বন্ধ হওয়ার ঠিক আগে, এরকম কিছু ঘটেছিল সম্ভবত । গত কমান্ড চালানোর জন্য লিপিতে সম্ভবত ব্যর্থতা প্রতিবেদন (যদিও তার "ব্যর্থতা" সম্পূর্ণই সূক্ষ্ম বা এমনকি প্রয়োজনীয় হতে পারে), যা স্ক্রিপ্ট প্রতিবেদন ব্যর্থতা তোলে।
পরীক্ষাগুলি ব্যর্থ
একটি বিশেষ ধরণের কমান্ড হ'ল একটি পরীক্ষা , যার দ্বারা বোঝা যায় একটি কমান্ড তার পার্শ্ব প্রতিক্রিয়াগুলির পরিবর্তে তার রিটার্ন মানটির জন্য চালিত হয়। অর্থাৎ, একটি পরীক্ষা একটি কমান্ড যা চালিত হয় যাতে এটির প্রস্থান স্থিতি পরীক্ষা করা যায় (এবং তার উপর অভিনয় করা)।
উদাহরণস্বরূপ, ধরুন আমি 4 টি 5 এর সমান কিনা ভুলে যাচ্ছি ভাগ্যক্রমে, আমি শেল স্ক্রিপ্টিং জানি:
if [ 4 -eq 5 ]; then
echo "Yeah, they're totally the same."
fi
এখানে, পরীক্ষা [ -eq 5 ]
ব্যর্থ হয়েছে কারণ এটি সর্বোপরি 4 ≠ 5 হয়। এর অর্থ এই নয় যে পরীক্ষাটি সঠিকভাবে সম্পাদিত হয়নি; ইহা কর. কাজটি 4 = 5 হয় কিনা তা যাচাই করা ছিল, তবে যদি সাফল্যের খবর দেওয়া হয়, এবং যদি না হয় তবে ব্যর্থতা।
আপনি দেখুন, শেল স্ক্রিপ্টিংয়ে, সাফল্যটি সত্যও বোঝাতে পারে এবং ব্যর্থতাও মিথ্যা বলতে পারে ।
যদিও echo
বিবৃতিটি কখনও চালিত হয় না, if
সামগ্রিকভাবে ব্লকটি সাফল্যের সাথে ফিরে আসে।
তবে, আমি মনে করি আমি এটি আরও ছোট লিখেছি:
[ 4 -eq 5 ] && echo "Yeah, they're totally the same."
এটি সাধারণ শর্টহ্যান্ড। &&
একটি বুলিয়ান এবং অপারেটর। উভয় পক্ষের সত্য (সাফল্য) না প্রত্যাখ্যান করে উভয় পক্ষের বিবৃতি &&
নিয়ে গঠিত একটি অভিব্যক্তি &&
মিথ্যা (ব্যর্থতা) প্রদান করে। ঠিক যেমন একটি স্বাভাবিক এবং ।
যদি কেউ আপনাকে জিজ্ঞাসা করে, "ডেরেক কি মলে গিয়ে প্রজাপতির কথা ভেবেছিল?" এবং আপনি জানেন যে ডেরেক মলে যান নি, আপনি যদি প্রজাপতির কথা ভেবে থাকেন তবে আপনাকে এটির চিন্তা করতে হবে না।
একইভাবে, যদি বাম দিকের কমান্ডটি &&
ব্যর্থ হয় (মিথ্যা), সম্পূর্ণ &&
এক্সপ্রেশনটি অবিলম্বে ব্যর্থ হয় (মিথ্যা)। ডানদিকে স্টেটমেন্ট &&
কখনও চালানো হয় না।
এখানে, [ 4 -eq 5 ]
রান। এটি "ব্যর্থ" (মিথ্যা প্রত্যাবর্তন)। সুতরাং পুরো &&
এক্সপ্রেশন ব্যর্থ। echo "Yeah, they're totally the same."
কখনও চালায় না। সবকিছু যেমনটি হওয়া উচিত তেমন আচরণ করা হয়েছে, তবে এই কমান্ডটি ব্যর্থতার খবর দেয় (যদিও if
উপরে বর্ণিত সমতুল্য শর্ত সাপেক্ষে সাফল্যের রিপোর্ট দেয়)।
যদি এটি কোনও স্ক্রিপ্টের সর্বশেষ বিবৃতি হয় (এবং স্ক্রিপ্টটি এর আগে কোনও সময়ে সমাপ্তির পরিবর্তে এটি পেয়ে যায়), পুরো স্ক্রিপ্টটি ব্যর্থতার খবর দেয় ।
এর বাইরেও প্রচুর পরীক্ষা রয়েছে। উদাহরণস্বরূপ, ||
("বা") দিয়ে পরীক্ষা রয়েছে । তবে উপরের উদাহরণটি পরীক্ষাগুলি কী তা ব্যাখ্যা করার জন্য পর্যাপ্ত হওয়া উচিত এবং নির্দিষ্ট বিবৃতি / আদেশটি পরীক্ষা কিনা তা নির্ধারণ করার জন্য আপনার পক্ষে ডকুমেন্টেশন কার্যকরভাবে ব্যবহার করা সম্ভব করে তোলে।
sh
বনাম sh -e
, পুনর্বিবেচিত
যেহেতু লাইন (এছাড়াও দেখুন এই প্রশ্নের উপরের) হয়েছে , অপারেটিং সিস্টেম স্ক্রিপ্টটি চালানোর যেন এটা আদেশের সঙ্গে প্রার্থনা করা হয়েছে:#!
/etc/rc.local
sh -e
sh -e /etc/rc.local
বিপরীতে, আপনার অন্যান্য স্ক্রিপ্টগুলি যেমন পতাকা ছাড়াইstartup_script.sh
চালানো হয় :-e
sh /home/incero/startup_script.sh
ফলস্বরূপ তারা চালিয়ে যেতে থাকে এমনকি যখন তাদের মধ্যে কোনও আদেশ কোনও ব্যর্থতার কথা জানায়।
এটি স্বাভাবিক এবং ভাল। - না চালিত বেশিরভাগ স্ক্রিপ্ট সহ - এবং বেশিরভাগ অন্যান্য স্ক্রিপ্টগুলির rc.local
সাথে আমন্ত্রণ জানানো উচিত ।sh -e
rc.local
পার্থক্যটি মনে রাখার বিষয়টি নিশ্চিত করুন:
স্ক্রিপ্টগুলি sh -e
প্রস্থান রিপোর্টিং ব্যর্থতার সাথে চালিত হয় যখন প্রথমবারের মধ্যে একটি কমান্ড থাকে তার কমান্ড থাকে ব্যর্থতার প্রতিবেদন থেকে বেরিয়ে আসে।
এটি হ'ল স্ক্রিপ্টটি একক দীর্ঘ কমান্ড যা স্ক্রিপ্টের সমস্ত কমান্ড সমন্বিত করে &&
অপারেটরদের সাথে যোগ দেয় ।
স্ক্রিপ্টগুলি sh
(ছাড়া -e
) দিয়ে চালিত হয় যতক্ষণ না তারা কোনও কমান্ড পায় যা এগুলি শেষ করে (বাইরে বেরিয়ে আসে) বা স্ক্রিপ্টের একেবারে শেষ পর্যন্ত। প্রতিটি কমান্ডের সাফল্য বা ব্যর্থতা মূলত অপ্রাসঙ্গিক (যদি না পরবর্তী কমান্ড এটি পরীক্ষা করে না)। স্ক্রিপ্টটি শেষ কমান্ড রানের প্রস্থান স্থিতি দিয়ে প্রস্থান করে।
আপনার স্ক্রিপ্ট বুঝতে এটির ব্যর্থতা মোটেও বুঝতে সহায়তা করা
যখন আপনার স্ক্রিপ্টটি ব্যর্থ হয়েছিল তখন তা ভাবতে বাধা দিতে পারেন কীভাবে?
এটি সঞ্চালনের ঠিক আগে কী ঘটে তা দেখুন look
যদি কোনও কমান্ড সফল হয় যখন ব্যর্থ হয়, তা কেন খুঁজে বের করুন এবং সমস্যাটি ঠিক করুন।
যদি কোনও কমান্ড ব্যর্থ হয়, এবং এটি হ'ল সঠিক জিনিস, তবে সেই ব্যর্থতার স্থিতিকে প্রচার থেকে বিরত করুন।
প্রচার থেকে ব্যর্থতার স্থিতি রাখার একটি উপায় হ'ল সফলভাবে সফল হওয়া আরেকটি কমান্ড চালানো। /bin/true
এর কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং সাফল্যের খবর /bin/false
দেয় (ঠিক যেমন কিছুই করে না এবং ব্যর্থও হয়)।
আর একটি হ'ল স্ক্রিপ্টটি সমাপ্ত হয় তা নিশ্চিত করা exit 0
।
exit 0
স্ক্রিপ্টের শেষে থাকা একই জিনিসটি অগত্যা নয় । উদাহরণস্বরূপ, সেখানে কোনও if
ব্লক থাকতে পারে যেখানে স্ক্রিপ্টটি ভিতরে প্রবেশ করে।
আপনার স্ক্রিপ্টটি সাফল্যের প্রতিবেদন করার আগে, ব্যর্থতার কারণ কী কারণ তা জানা ভাল। যদি এটি সত্যিই কোনওভাবে ব্যর্থ হয় (আপনি যা করতে চান তা না করার অর্থে), আপনি সত্যিকার অর্থে এটি সাফল্যের প্রতিবেদন করতে চান না।
একটি দ্রুত ফিক্স
যদি আপনি startup_script.sh
প্রস্থান রিপোর্টিংয়ের সাফল্য অর্জন করতে না পারেন তবে আপনি rc.local
যে কমান্ডটি চালায় সেটিকে পরিবর্তন করতে পারেন , যাতে সেই কমান্ডটি সাফল্যের খবর দেয় যদিও startup_script.sh
তা না হয়।
বর্তমানে আপনার কাছে রয়েছে:
sh /home/incero/startup_script.sh
এই কমান্ডের একই পার্শ্ব প্রতিক্রিয়া রয়েছে (যেমন চলমানের পার্শ্ব প্রতিক্রিয়া startup_script.sh
) তবে সর্বদা সাফল্যের খবর দেয়:
sh /home/incero/startup_script.sh || /bin/true
মনে রাখবেন, কেন startup_script.sh
ব্যর্থতা রিপোর্ট করে এবং এটি ঠিক করে রাখা ভাল।
কুইক ফিক্স কীভাবে কাজ করে
এটি আসলে একটি ||
পরীক্ষা, একটি বা পরীক্ষার উদাহরণ ।
ধরুন আপনি জিজ্ঞাসা করুন আমি কি আবর্জনা বের করেছি বা পেঁচা ব্রাশ করেছি কিনা? আমি যদি আবর্জনা বের করে ফেলেছি তবে আমি পেঁচা ব্রাশ করেছি কিনা তা আমার মনে না থাকলেও আমি সত্যই "হ্যাঁ" বলতে পারি।
||
রান বামে কমান্ড । যদি এটি সফল হয় (সত্য), তবে ডান হাতটি চালাতে হবে না। সুতরাং যদি startup_script.sh
সাফল্যের রিপোর্ট হয় তবে true
কমান্ডটি কখনই চালিত হয় না।
তবে, যদি startup_script.sh
রিপোর্টগুলি ব্যর্থ হয় [আমি আবর্জনা বের করিনি] , তবে /bin/true
[যদি আমি পেঁচা ব্রাশ করে] তবে এর ফলাফল ।
/bin/true
সর্বদা সাফল্য ফিরে আসে (বা সত্য , যেমন আমরা কখনও কখনও এটি বলে থাকি)। ফলস্বরূপ, সম্পূর্ণ কমান্ড সফল হয় এবং পরবর্তী কমান্ডটি rc.local
চলতে পারে।
সাফল্য / ব্যর্থতার উপরে একটি অতিরিক্ত নোট, সত্য / মিথ্যা, শূন্য / ননজারো।
নির্দ্বিধায় এটিকে অবহেলা করুন। আপনি যদি এটি একাধিক ভাষায় প্রোগ্রাম করেন তবে এটি পড়তে চাইতে পারেন (যদিও, কেবল শেল স্ক্রিপ্টিং নয়)।
এটি শেলের স্ক্রিপ্টারের জন্য সি জাতীয় প্রোগ্রামিং ভাষা গ্রহণের জন্য এবং সি প্রোগ্রামারদের শেল স্ক্রিপ্টিং গ্রহণের জন্য এটি আবিষ্কারের জন্য বিভ্রান্তির একটি বিষয়:
শেল স্ক্রিপ্টিং এ:
- একটি ফেরত মান
0
মানে বিজয় এবং / অথবা সত্য ।
- ছাড়া অন্য কিছু একটা ফেরত মান
0
মানে ব্যর্থতা এবং / অথবা মিথ্যা ।
সি প্রোগ্রামিংয়ে:
- মিথ্যা
0
মানে একটি ফেরতের মান ..
- ছাড়া অন্য কিছু একটা ফেরত মান
0
মানে সত্য ।
- সাফল্য বলতে কী বোঝায় এবং ব্যর্থতা যার অর্থ কোন সহজ নিয়ম নেই। কখনও কখনও
0
সাফল্য বোঝায়, অন্য সময়গুলির অর্থ ব্যর্থতা, অন্য সময় এর অর্থ আপনি সবে যুক্ত দুটি সংখ্যার যোগফল শূন্য। সাধারণ প্রোগ্রামিংয়ে রিটার্ন মানগুলি বিভিন্ন ধরণের তথ্যের বিস্তৃত সংকেত দিতে ব্যবহৃত হয়।
- কোনও প্রোগ্রামের সংখ্যাগত প্রস্থান স্থিতি শেল স্ক্রিপ্টিংয়ের নিয়ম মেনে সাফল্য বা ব্যর্থতা নির্দেশ করে। এটি হ'ল যদিও
0
আপনার সি প্রোগ্রামটিতে মিথ্যা অর্থ হওয়া সত্ত্বেও , আপনি এখনও 0
যদি এটির সাফল্যের সাথে রিপোর্ট করতে চান তবে আপনার প্রোগ্রামটিকে তার প্রস্থান কোড হিসাবে ফিরিয়ে আনবে (যা শেলটি পরে সত্য হিসাবে ব্যাখ্যা করে )।