আমি কীভাবে শেল স্ক্রিপ্ট তৈরি করব যা কোনও প্রক্রিয়াতে আউটপুট প্রেরণ করে


11

আমি বর্তমানে একটি স্ক্রিনে একটি সার্ভার কনসোল প্রোগ্রাম চালাচ্ছি কারণ আমার এটি পড়ার এবং মাঝে মাঝে কমান্ড প্রেরণ করা দরকার।

আমি ব্যাকগ্রাউন্ডে ডেমন হিসাবে অ্যাপটি চালাতে চাই (এটি দিয়ে / init দিয়ে থামিয়ে দিন)।

আমি tail -fলগ করতে পারি , কিন্তু এটি আমাকে প্রক্রিয়াতে ইনপুট প্রেরণ করতে দেয় না।

এটি সেট আপ করার কোনও উপায় আছে যাতে আমি উভয়ই ইনপুট পড়তে এবং পাঠাতে পারি, তবে এখনও এটি ব্যাকগ্রাউন্ডে চলছে?

আমি বিভিন্ন প্রসেস থেকে ডেমনে ইনপুট প্রেরণ করতে সক্ষম হতে চাই (উদাহরণস্বরূপ "স্টপ \ n" কমান্ড প্রেরণ করতে পারে এমন একটি শেল স্ক্রিপ্ট)।


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

উত্তর:


9

একটি পাইপ থেকে পড়ুন, একটি ফাইল লিখুন

আপনি যদি ডিমনকে কিছু স্বেচ্ছাসেবী প্রক্রিয়া দ্বারা উত্পাদিত ইনপুট পড়তে চান তবে আপনাকে সেই প্রক্রিয়াটি পাইপের সাথে সংযুক্ত করতে হবে। এখানে স্বেচ্ছাচারী প্রক্রিয়াটি হ'ল আপনি আদেশগুলি প্রতিধ্বনি করছেন এবং এটি অন্য একটি প্রসঙ্গে চলেছে in সুতরাং একটি নামযুক্ত পাইপ তৈরি করুন (প্রায়শই ইউনিক্স প্রসঙ্গে ফিফো বলা হয়)।

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

এবং কেবল পাইপে কমান্ড লিখুন:

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

তবে এটি যেমন কাজ করবে তেমন সম্ভাবনা নেই: ডেমোন তার স্ট্যান্ডার্ড ইনপুটটিতে ফাইলের শেষ দেখলে বেরিয়ে আসার একটি ভাল সম্ভাবনা রয়েছে, যা পাইপকে লেখার প্রথম প্রক্রিয়াটি শেষ হওয়ার সাথে সাথে ঘটে। আপনি tail -fএই সমস্যা এড়াতে ব্যবহার করতে পারেন ।

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

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

আপনি যখন ডিমনটি থামান, প্রক্রিয়াটি echo >/var/run/daemon.fifoমেরে ফেলবে tail


স্ক্রিনের ভিতরে প্রোগ্রাম শুরু করা

আপনার পরিষেবা পরিচালক থেকে সরাসরি ডিমন আহ্বান না করে (আপনি কি সত্যই সিসিভি ইন, বা মোড়ক স্ক্রিপ্ট বা আপস্টার্টের মতো অতিরিক্ত কিছু ব্যবহার করছেন?) অনুরোধ করুন

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

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

এটা টেকনিক্যালি সম্ভব একটি টার্মিনালে একটি চলমান প্রক্রিয়া সংযুক্ত করতে, কিন্তু একটি ঝুঁকি আপনি প্রোগ্রাম ক্র্যাশ করব, তাই এটি একটি উৎপাদন ব্যবস্থা জন্য স্পষ্টভাবে হয়।

-Lবিকল্প পর্দা লেখার সবকিছু যে একটি ফাইলে তার উইন্ডোতে প্রদর্শিত তোলে। ফাইলের নামটি নির্দেশের daemon.screenrcসাথে দেওয়া হয়েছে logfile


আসলে, আমি সত্যিই এটির স্ক্রিপ্ট থেকে স্টিডিনকে বার্তা প্রেরণে সক্ষম হতে চাই - সম্ভবত এটিই আমার প্রশ্ন করা উচিত ছিল question বর্তমানে আমি একটি স্ক্রিপ্ট থেকে সার্ভারটি চালাচ্ছি এবং এটি একটি টার্মিনালে টাইপ করতে সক্ষম হয়েছি, তবে এটি কেবল একটি পরিষেবা হিসাবে চলমান হওয়া উচিত বলে মনে হচ্ছে ...
বিল কে

@ বিল: ঠিক আছে, আমি দেখছি তারপরে আমার মনে যে প্রথম জিনিসটি আসে তা হ'ল নামযুক্ত পাইপ।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

আমি মনে করি এটিই আমি @ গিলসকে চাই! যদিও আমার এটি আরও ভালভাবে বুঝতে হবে। আমি এটি খুঁজে বের করার জন্য ম্যান পেজগুলির মাধ্যমে বাছাই করার জন্য কিছুটা সময় ব্যয় করব - আমি সত্যই এর থেকে খুব সামান্যই পাই (আপনি যা করছেন তার বেশিরভাগ অংশই পেয়েছি এবং আপনি কীভাবে করেছিলেন তার প্রায় কোনওটাই আমি পাইনি - এবং আমি ভেবেছিলাম আমার এক ধরণের ছিল এই স্টাফটি দিয়ে ক্লু করুন)) আমার তত্ত্বটি সরাসরি প্রক্রিয়াটির সাথে সংযোগ স্থাপন করার জন্য নয় তবে এটির সাথে একটি অন্য স্ক্রিপ্ট তৈরি করা হয়েছিল যাতে এটি আই / ও-তে যোগ দিয়েছিল এটি ডিজনস ও / আই-তে যুক্ত হয়েছিল যেন এটি দেখতে আসল কনসোলটি চলছে, তবে দক্ষতার সাথে একই সাথে অন্য স্ক্রিপ্ট থেকে 'ফরওয়ার্ড 10' প্রতিধ্বনি করতে হবে।
বিল কে

আমি মনে করি আমি এটির অনেক কিছু পেয়েছি। যদি আমি এটি ভেঙে ফেলি তবে আমি এখন "এমকেফিফো পাইপ" এবং "টেল-ফ পাইপ | কমান্ড> আউটপুট" বুঝতে পারি, সেগুলি পরীক্ষা করেছিলাম এবং তারা কাজ করে। আমার মনে হয় আপনার কাছে থাকা অন্যান্য জিনিসগুলির বেশিরভাগটি এটি একটি লাইনে চালিত করার কৌশল ছিল - আমি কি কিছু সমালোচনামূলক মিস করছি?
বিল কে

@ বিল: আপনি বাইরে থেকে স্ক্রিনের ভিতরে টার্মিনালে লিখতে পারেন (পর্দার stuffআদেশ ব্যবহার করে )। তবে আপনার এখানে টার্মিনালের ওভারহেড (প্রক্রিয়াজাতকরণ, তবে সবচেয়ে গুরুত্বপূর্ণ জ্ঞানীয়) দরকার নেই, একটি পাইপ প্রায় পর্যাপ্ত (ফাইলের উপেক্ষা করার সাথে সম্পর্কিত রিলে প্রক্রিয়াটির সাথে এটি যথেষ্ট)। আপনার সাথে একটি সামান্য পরীক্ষা করতে চাইতে পারেন <fifo catবা <fifo tail -f | catএক টার্মিনাল এবং echo >fifo; echo >fifoঅন্য টার্মিনালে; আমি মনে করি আপনি ভাল থাকবেন।
গিলস 'দু: খিত হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.