"সেট-এম" কী করে কেউ বিশদে ব্যাখ্যা করতে পারে?


17

উপর man পৃষ্ঠা , এটা ঠিক বলেছেন:

-ম জব নিয়ন্ত্রণ সক্ষম।

কিন্তু আসলে এর অর্থ কী?

আমি এই কমান্ডটি একটি এসও প্রশ্নে এসেছি, আমার ওপি-র মতো একই সমস্যা রয়েছে যা "ফ্যাব্রিক টমক্যাট শুরু করতে পারে না"। এবং এটি set -mসমাধান। ওপি কিছুটা ব্যাখ্যা করেছে, তবে আমি বেশ বুঝতে পারি না:

ইস্যুটি পটভূমির কাজগুলিতে ছিল কারণ কমান্ডটি শেষ হওয়ার পরে তারা হত্যা করা হবে।

সমাধানটি সহজ: কেবল "সেট-এম;" যুক্ত করুন কমান্ডের আগে উপসর্গ।

উত্তর:


10

বাশ ডকুমেন্টেশনের উদ্ধৃতি (থেকে man bash):

JOB CONTROL
       Job  control  refers to  the  ability  to selectively  stop
       (suspend) the execution of  processes and continue (resume)
       their execution at a later point.  A user typically employs
       this facility via an interactive interface supplied jointly
       by the operating system kernel's terminal driver and bash.

সুতরাং, বেশ সহজভাবেই বলেছিলেন, set -m(ইন্টারেক্টিভ শেলগুলির জন্য ডিফল্ট) থাকার ফলে একজন বিল্ট-ইনগুলি ব্যবহার করতে দেয় fgএবং যেমন bg, set +m(অ ইন্টারেক্টিভ শেলগুলির জন্য ডিফল্ট) এর অধীনে অক্ষম করা হবে ।

চাকরি নিয়ন্ত্রণ এবং প্রস্থান করার সময় পটভূমি প্রক্রিয়াগুলির মধ্যে যে সংযোগ রয়েছে তা আমার কাছে স্পষ্ট নয় তবে তবে আমি নিশ্চিত করতে পারি যে সেখানে একটি রয়েছে: রানিং set -m; (sleep 10 ; touch control-on) &ফাইলটি তৈরি করবে যদি সেই আদেশটি টাইপ করার পরে কেউ শেলটি ছেড়ে দেয় তবে তা set +m; (sleep 10 ; touch control-off) &হবে না।

আমি মনে করি উত্তরটি অন্যান্য ডকুমেন্টেশনের মধ্যে রয়েছে set -m:

-m      Monitor  mode. [...]                     Background pro‐
        cesses run in a separate process group and a  line  con‐
        taining  their exit status is printed upon their comple‐
        tion.

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

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


আপনার উত্তরের জন্য Thx, তবে কীভাবে tomcat/bin/startup.shসম্পর্কিত fg/ bg?
laike9m

1
এটি সরাসরি সম্পর্কিত নয়; আমি উত্তর দেওয়ার চেষ্টা করছিলাম "জব নিয়ন্ত্রণ সক্ষম হয়েছে / এর আসলে কী বোঝায়?" একটি সাধারণ উপায়ে সম্ভবত আমি এটি পরিষ্কার করে দিয়েছি না, তবে আপনার স্ক্রিপ্টে একটি ব্যাকগ্রাউন্ড কাজ শুরু হবে বলে মনে হচ্ছে যা আমার বাকী উত্তরটি প্রযোজ্য।
ধাগ

2

আমি এটি গিথুব ইস্যু তালিকায় পেয়েছি এবং আমি মনে করি এটি সত্যই আপনার প্রশ্নের উত্তর দেয়।

এটি আসলে কোনও এসএসএইচ সমস্যা নয়, এটি বেস বেসরকারী / ইন্টারেক্টিভ মোড এবং প্রক্রিয়া গ্রুপগুলিতে সংকেত প্রচারের আশেপাশে আরও সূক্ষ্ম আচরণ।

নিম্নলিখিতটি /programming/14679178/why-does-ssh-wait-for-my-subshells-without-t-and-kill-them-with-t/14866774#14866774 এবং http এর উপর ভিত্তি করে : কিছু অনুমানগুলি সম্পূর্ণরূপে যাচাই করা হয়নি, তবে //www.itp.uzh.ch/~dpotter/howto/daemonize , তবে কীভাবে এটি কাজ করে তা পরীক্ষা করে নিচ্ছে তা পরীক্ষা করে।

pty / tty = মিথ্যা

লঞ্চ করা বাশ শেল প্রারম্ভিক প্রক্রিয়াটির স্টাডাউট / স্টডার / স্টিডিনের সাথে সংযোগ স্থাপন করে এবং সকেটের সাথে কিছু সংযুক্ত না থাকে এবং শিশুরা বেরিয়ে না আসা পর্যন্ত চালিয়ে রাখা হয়। একটি ভাল ডিমন প্রক্রিয়া নিশ্চিত করবে যে এটি তার বাচ্চাদের প্রস্থান করার অপেক্ষা রাখে না, একটি শিশু প্রক্রিয়া কাঁটাচামচ করে তারপরে প্রস্থান করে। যখন এই মোডে থাকবেন তখন এসএসএইচ দ্বারা কোনও শিশু প্রক্রিয়াতে কোনও সিএইচইচপি প্রেরণ করা হবে না। আমি বিশ্বাস করি এটি বেশিরভাগ স্ক্রিপ্টগুলি এমন একটি প্রক্রিয়া চালানোর জন্য সঠিকভাবে কাজ করবে যা নিজেকে ডিমনাইজিং পরিচালনা করে এবং ব্যাকগ্রাউন্ড করার দরকার নেই। যেখানে থ্রি স্ক্রিপ্টগুলি কোনও প্রক্রিয়ার ব্যাকগ্রাউন্ডে '&' ব্যবহার করে তারপরে সম্ভবত সম্ভবত সমস্যাটি হবে যে ব্যাকগ্রাউন্ড প্রক্রিয়াটি স্টিডিনের কাছ থেকে কখনও পড়ার চেষ্টা করে না কারণ এটি সেশনটি বন্ধ হয়ে গেলে সাইনআপকে ট্রিগার করবে UP

pty / tty = সত্য *

যদি প্রক্রিয়াটির সূচনাটি স্ক্রিপ্টের ব্যাকগ্রাউন্ডে করে, প্যারেন্ট BASH শেলটি এসএসএইচ সংযোগে একটি প্রস্থান কোড ফেরত দেবে, যা তাত্ক্ষণিকভাবে প্রস্থান করতে দেখাবে কারণ এটি কোনও শিশু প্রক্রিয়াটি বন্ধ হওয়ার অপেক্ষায় নেই এবং স্টাডআউটে অবরুদ্ধ নয় since / দ্বারা stderr / stdin। এটি প্যারেন্ট বাশ শেল প্রক্রিয়া গোষ্ঠীতে একটি সিএইচএইচপি প্রেরণের কারণ ঘটবে, যেহেতু চাকরী নিয়ন্ত্রণ ব্যাশ-অ-ইন্টারেক্টিভ মোডে অক্ষম করা হয়েছে, সবেমাত্র চালু হওয়া শিশু প্রক্রিয়াগুলিকে অন্তর্ভুক্ত করবে। কাঁটাচামচ বা কাঁটাচামচ প্রক্রিয়া চলাকালীন ডেমন প্রক্রিয়াটি স্পষ্টভাবে একটি নতুন প্রক্রিয়া সেশন শুরু করে তবে বা এটি বাচ্চারা বাশ অভিভাবক প্রক্রিয়া থেকে বেরিয়ে আসার জন্য সাইনআপ গ্রহণ করবে না। নোট করুন এটি স্থগিত করা চাকরির থেকে পৃথক যা একটি সিগমেন্টটার দেখতে পাবে। আমি সন্দেহ করি যে এই চারপাশের সমস্যাগুলির মধ্যে কেবল কখনও কখনও কাজ করা সামান্য রেসের শর্তের সাথেই করতে হয়। http://www.itp.uzh.ch/~dpotter/howto/daemonize , আপনি দেখতে পাবেন যে কোডটিতে নতুন অধিবেশনটি কাঁটাচামচ প্রক্রিয়া দ্বারা তৈরি করা হবে যা পিতামাতাকে প্রস্থান করার আগে চালানো হতে পারে না, ফলে এলোমেলো ফলাফল হয় উপরোক্ত সাফল্য / ব্যর্থতার আচরণ। একটি ঘুমের বিবৃতিটি কাঁটাচামচ প্রক্রিয়াটির জন্য একটি নতুন অধিবেশন তৈরি করার পর্যাপ্ত সময় দেবে, যার কারণে এটি কিছু ক্ষেত্রে কাজ করে।

pty / tty = সত্য এবং কাজের নিয়ন্ত্রণ স্পষ্টভাবে ব্যাশে সক্ষম করা হয়েছে

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

কি ঠিক করা প্রয়োজন

আমি মনে করি যে পটভূমি প্রক্রিয়া / পরিষেবাদিগুলির সাথে কাজ করার সময় সমাধানগুলি স্পষ্টভাবে রান / সুডো অপারেশন ডকুমেন্টেশনে একটি বিশেষ কেস হিসাবে উল্লেখ করা দরকার। মূলত হয় 'pty = মিথ্যা' ব্যবহার করুন, বা যেখানে এটি সম্ভব নয়, স্পষ্টভাবে প্রথম কমান্ড হিসাবে কাজ নিয়ন্ত্রণ সক্ষম করুন, এবং আচরণটি সঠিক হবে।

Https://github.com/fabric/fabric/issues/395 থেকে

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