ব্যাকগ্রাউন্ড বা বুট স্ক্রিপ্ট লগ আউটপুট


10

আমার একটি শর্ট স্ক্রিপ্ট রয়েছে যা বিশেষ ইভেন্টগুলির জন্য সিস্টেম ডেমন দ্বারা সম্পাদিত হয়। আমি জানি যে ঘটনাটি ঘটছে এবং স্ক্রিপ্টটি কার্যকর হচ্ছে, তবে এটি আমার ইচ্ছামত তা করে না। আশ্চর্যের বিষয় হল, আমি যখন এটি ম্যানুয়ালি চালিত করি তখন এটি ঘটে তাই আমি খুব বিভ্রান্ত হয়ে পড়েছি।

কী চলছে তা আমি কীভাবে বুঝতে পারি? স্ক্রিপ্টটি মূলত এরকম একটি কমান্ডের সিরিজ:

/bin/foo on 3
sudo bar a

আমি বুঝতে পারি এটি ডিবাগিং সিস্টেম স্ক্রিপ্টগুলির একটি টিউটোরিয়াল হওয়ার উদ্দেশ্যে করা হয়েছে, তবে এটি কিছুটা হলেও U&L। আমি শিরোনামটি ভুলভাবে পড়েছি এবং "ডিবাগিংয়ের জন্য কোনও সিস্টেম স্ক্রিপ্টের আউটপুট লগইন করা" উদ্দেশ্যটি আরও পরিষ্কার করে দেবে বলে পরামর্শ দেব। এছাড়াও আমি যখন এই foo barউদাহরণগুলি পড়ি তখন আমার মস্তিষ্ক হিমশীতল হয়, আমি এমন কোনও কিছুকে পছন্দ করি যা আরও বাস্তব বিশ্বের দেখায়। আমি কোনও পোস্ট সম্পাদনা করতে নারাজ, সুতরাং আপনি যদি এটির উন্নতি হতে পারে বলে মনে করেন এটি আপনার কাছে ছেড়ে দেব।
মিলিওয়েজ

1
@ মিলিওয়েজ আপনি ঠিক বলেছেন, "সিস্টেম স্ক্রিপ্ট" যাইহোক এক ধরণের ভুল ধারণা ছিল তাই আমি শিরোনামটি পরিবর্তন করেছি। আমি ফুবার বিষয়টির সাথে একমত নই - লোকেরা যে কোনও সংস্কৃতিতে যেমন সাধারণ ভাষায় / কথোপকথনকে তারা চিনতে শেখা দরকার। আপনি দু'জনকে একসাথে রাখার পরেও এটি এখনও একটি ভাল গিগল।
স্বর্ণলোকগুলি

উত্তর:


8

প্রথমত, যদি স্ক্রিপ্টটি কোনও সিস্টেম ডিমন দ্বারা চালিত হয় এবং সেই ডিমন মূল বৈশিষ্ট্যের সাথে চলতে থাকে, আপনাকে ব্যবহার করার দরকার নেই sudo। এর মধ্যে init(এবং systemd) অন্তর্ভুক্ত রয়েছে rc.local। যদি সেই ডিমন রুট সুবিধাগুলি নিয়ে চলমান না থাকে sudoতবে যদি /etc/sudoers(যেমন কোনও পাসওয়ার্ড ছাড়াই) কনফিগার করা না থাকে তবে কাজ করবে না । ব্যবহারকারীকে piডিফল্টরূপে কিছু করার অনুমতি দেওয়া হওয়ায় রাস্পবিয়ান ব্যবহারকারীগণ এতে বিভ্রান্ত হতে পারেন (এবং যদি আপনি /etc/sudoersএটি দেখতে পান তবে এটি কীভাবে সম্পন্ন হয়েছে তা দেখতে পাবেন)।

এরপরে, আপনি কোনও bashস্ক্রিপ্ট বা বাশ স্ক্রিপ্টের অভ্যন্তরে কোনও কমান্ডের কোনও সেট, আউটপুট ক্যাপচার করে এটিকে এই জাতীয় সাবশেলে চালিত করে: 1

(
    /bin/foo on 3
    sudo bar a
) &> /var/log/myTestLog.txt

()ইঙ্গিত একটি subshell । এর অভ্যন্তরীণ যে কোনও কিছুই থেকে সমস্ত আউটপুট একটি /var/log/myTestLog.txtফাইলে পুনর্নির্দেশ করা হচ্ছে । কয়েকটি নোট:

  • &>একটি হল bashism , তাই যদি স্ক্রিপ্ট একটি মাধ্যমে মৃত্যুদন্ড কার্যকর করা হয় কুঁড়েঘর প্রথম লাইন উপর, এটা করা উচিত #!/bin/bash, শুধু না /bin/sh"বাশিজম" কেবল শেলটিতে কাজ করে bash

    এর মধ্যে অন্তর্ভুক্ত রয়েছে /etc/rc.local, যা ডিফল্টরূপে ব্যবহার করে /bin/sh(যেমন, হ্যাঁ, আপনি নিরাপদে এতে পরিবর্তন করতে পারেন /bin/bash)।

  • /var/logলিখতে রুট সুবিধার দরকার। যদি প্রক্রিয়াটির তেমন কিছু না থাকে তবে আপনি এটি জানেন এমন ডিরেক্টরি ব্যবহার করুন বা তৈরি করুন। যখন সন্দেহ হয়, আপনি যদি সিস্টেমটি বন্ধ বা পুনরায় বুট না করে এটি পরীক্ষা করতে পারেন তবে এটি ব্যবহার করুন /tmpযা বিশ্ব লিখনযোগ্য (যেমন, কারও দ্বারা)। তবে /tmpবুট জুড়ে স্থির থাকে না। এটি একটি ছোট, র্যাম ভিত্তিক পার্টিশনও তাই এটিতে জিগের ডেটা লিখবেন না। এটি আপনার এসডি কার্ড নয় [বাস্তবে এটি রাস্পবিয়ানের বর্তমান সংস্করণগুলিতে রয়েছে তবে অনুশীলনে এটি বিবেচনা করবেন না]

  • &>কিছুতেই ওভাররাইট করবে myTestLog.txt। পরিবর্তে আপনি যদি কোনও বিদ্যমান লগতে সংযুক্ত করতে চান, যা ডিবাগিংয়ের উদ্দেশ্যে ভাল ধারণা হতে পারে, ব্যবহার করুন &>>। তারপরে আপনি এই সাব-শেলের শুরুতে একটি কমান্ড যুক্ত করতে পারেন:

    echo Starting $(date)

    প্রতিটি রান থেকে তথ্য আলাদা করা। এটি কী করে তা আপনি যদি নিশ্চিত না হন তবে কমান্ড লাইনে চেষ্টা করুন।

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

কনভেনশন দ্বারা, কমান্ডগুলি সম্পূর্ণ হওয়ার পরে 0 এর মানও দেয়। এটিকে কখনও কখনও "প্রস্থান স্থিতি" বলা হয় এবং আপনি সাধারণত এটি দেখতে পাবেন না, তবে শেলটি আপনাকে প্রদর্শন করবে echo $?। চেষ্টা

 ls /
 echo $?
 ls /nonexistantdir
 echo $?

আপনি 0 এবং 2 পাবেন you আপনি যদি ls"প্রস্থান স্থিতি" এর অধীনে ম্যান পৃষ্ঠাটিতে সন্ধান করেন তবে আপনি বরং অনির্বচনীয়, গুপ্তচর দেখতে পাবেন:

2      if serious trouble (e.g., cannot access command-line argument).

যা কিছু না থেকে ভাল হতে পারে বা নাও হতে পারে তবে আপনি সেখানে যান।

খুব কমপক্ষে, এটি নির্দেশ করে যে কোনও কারণে কমান্ডটি ব্যর্থ হয়েছে। প্রস্থান স্থিতি আপনাকে এ জাতীয় কিছু করতে দেয়:

/bin/foo && sudo bar

&&এই ক্ষেত্রে অর্থ হলো "যদি প্রথম কমান্ড সফল", প্রথম কমান্ড সাহসী 0 ফিরে সম্মেলন করে (যার কারণে তারা সাধারণত না)। যদি /bin/fooকাজ না করে, পাওয়া যায় না, ইত্যাদি, তবে sudo barকখনই ঘটবে না।

লগিং বার্তাগুলি এবং শর্তসাপেক্ষ কার্যকরকরণের সংমিশ্রণ ( &&) ব্যবহার করে আপনাকে সমস্যাটি নির্ণয়ের আরও কাছাকাছি পৌঁছে দেওয়া উচিত, বা সমস্যা সমাধানে সহায়তা করতে অন্যের পক্ষে কার্যকর হতে পারে এমন তথ্য প্রাপ্ত করা উচিত। তা ছাড়া, অন্য যে কেউ প্রায়শই করতে পারেন অনুমান।


1. আপনি অভ্যন্তরীণ থেকে সম্পূর্ণ স্ক্রিপ্টের জন্য একই আউটপুট পুনঃনির্দেশটি ব্যবহার করে ব্যবহার করতে পারেন:

exec &> /var/log/myTestLog.txt

শীর্ষে (বা অন্য যে কোনও জায়গায় এবং এটি পরবর্তী প্রতিটি ক্ষেত্রে প্রযোজ্য হবে)।


2

একটি গুরুত্বপূর্ণ দিক লোকেরা হ'ল স্ক্রিপ্টগুলি ডেমন হিসাবে চালানোর সময় ভুলে যেতে থাকে শেল পরিবেশ এবং $PATHবিশেষত পরিবর্তনশীল। আপনার উদাহরণে, দ্বিতীয় লাইন উপর নির্ভর $PATH: পুরো নাম sudoহল /usr/bin/sudo, এবং আপনার ব্যবহারকারী শেল শুধুমাত্র অনুসন্ধান করতে যে কারণ এটি বলা হয় জানেন /usr/binযখন এক্সেকিউটেবল খুঁজছেন। একই জন্য সত্য bar

sudoস্ক্রিপ্টগুলি ডিমন হিসাবে চালানোর সময় যেটির প্রয়োজন হয় না তা বিবেচনা করে আপনার দ্বিতীয় লাইনের মতো দেখতে হবে:

/path/to/bar a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.