আমি `& using ব্যবহার করছি: ব্যাকগ্রাউন্ডে প্রক্রিয়াটি কেন চলছে না?


24

আমি জানি যে আমি &ব্যাকগ্রাউন্ডে প্রক্রিয়াটি চালানোর জন্য একটি আদেশে যুক্ত করতে পারি ।

আমি একটি উবুন্টু ১২.০৪ বাক্সে এসএসএইচ করছি এবং এটি দিয়ে পাইথন প্রোগ্রাম চালাচ্ছি $python program.py &- তবে আমি যখন টার্মিনাল উইন্ডোটি বন্ধ করতে যাব তখন আমি একটি বার্তা পেলাম যে টার্মিনালটি বন্ধ করার ফলে চলমান প্রক্রিয়াটি নষ্ট হয়ে যাবে।

কেন? ব্যাকগ্রাউন্ডে প্রক্রিয়াটি চালানোর জন্য আমি অ্যাম্পারস্যান্ড ব্যবহার করছি। আমি যদি এসএসএইচড থাকি তবে তা কীভাবে চালানো যায়?



অ্যাপটি-
ক্যাপচা

উত্তর:


51

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

এটি প্রায় 2 উপায় আছে।

  1. আপনার শেল থেকে ব্যাকগ্রাউন্ড প্রোগ্রামটি আলাদা করুন।
    1. disownআপনার প্রক্রিয়াটি ব্যাকগ্রাউন্ড করার পরে কমান্ডটি ব্যবহার করুন । এটি শেলটিকে এটি ভুলে যাবে।
    2. আপনার আদেশটি nohup( nohup $python program.py &) দিয়ে প্রিফিক্স করুন । এটি একই জিনিসটি সম্পাদন করে তবে একটি মধ্যবর্তী প্রক্রিয়া ব্যবহার করে। মূলত এটি SIGHUP সিগন্যালটিকে উপেক্ষা করে এবং তারপরে সেটিংটি উত্তরাধিকার সূত্রে প্রাপ্ত আপনার প্রোগ্রামটিকে কাঁটাচামাল করে এবং কার্যকর করে এবং তারপরে বাইরে চলে যায়। এটি ফোরকড হওয়ার কারণে, প্রোগ্রামটি চালু হচ্ছে এটি শেলের শিশু নয়, এবং শেলটি এটি সম্পর্কে জানে না। এবং এটি SIGHUP- র জন্য একটি সিগন্যাল হ্যান্ডলার ইনস্টল না করা পর্যন্ত এটি উপেক্ষা করার ক্রিয়াটিকে যাইহোক রাখে।
  2. logoutটার্মিনাল উইন্ডোটি বন্ধ করার পরিবর্তে ব্যবহার করুন । আপনি যখন ব্যবহার করবেন logout, এটি কোনও সিগআপ নয়, এবং শেলটি এর কোনও শিশুকেই একটি সিএইচএইচএপি প্রেরণ করবে না।

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


4
প্রযুক্তিগতভাবে, sshমারা যাওয়ার কারণে সংযোগটি ড্রপ হয়ে যায়, সংযোগটি sshdঅন্য প্রান্তে ড্রপ হওয়ার কারণে মারা যায়। যে sshd সিউডো টার্মিনালের মাস্টার সাইডটি নিয়ন্ত্রণ করে যা রিমোট শেলটি চালায়, যখন এটি মারা যায়, এটি একটি হ্যাং-আপ (এটি একটি বাস্তব টার্মিনালে প্লাগ টানানোর মতো), সুতরাং সিস্টেমটি রিমোট শেলটিতে একটি SIGHUP প্রেরণ করে।
স্টাফেন চেজেলাস

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

4
কিছু মনে করবেন না, আমার নিজের প্রশ্নের উত্তর দিয়েছেন। পসিক্স আইইইই 1003.1 অধ্যায় 11, যদি কোনও নিয়ন্ত্রণকারী টার্মিনালের জন্য টার্মিনাল ইন্টারফেসের মাধ্যমে কোনও মডেম সংযোগ বিচ্ছিন্ন হয়ে যায় ... SIGHUP সংকেতটি নিয়ন্ত্রণের প্রক্রিয়াতে প্রেরণ করা হবে
প্যাট্রিক

2
এছাড়াও আপনি যে প্রোগ্রামটি দিয়ে শুরু করেন তার আউটপুট সহ nohupএকটি nohup.outফাইল উত্পন্ন করে তা নোট করুন । আপনি যখন কোনও অ্যাপ্লিকেশন শুরু করার জন্য নোহুপ ব্যবহার করেছেন তখনই এই ফাইলটি মুছে ফেলতে বিরক্ত হতে পারে (বা আপনাকে এর আউটপুটটিতে পুনর্নির্দেশ করতে হবে /dev/null)।
রুসলান

1
পরিবর্তে nohup python program.py &আমি এর পরিবর্তে ব্যবহারের পরামর্শ দেব setsid python program.py, যা তত্ক্ষণাত প্রোগ্রামটি অস্বীকার করে।
হাইটেকম্পিউটারজেক

14

প্রক্রিয়াটি টার্মিনালের পটভূমিতে চলছে তবে stdout(এবং stderr) থেকে আউটপুট এখনও টার্মিনালে প্রেরণ করা হচ্ছে। এটি বন্ধ করতে, উভয় আউটপুটগুলিতে পুনর্নির্দেশের > /dev/null 2>&1আগে যোগ করুন - এটি যুক্ত করে নিশ্চিত করে যে আপনি টার্মিনালটি বন্ধ করার পরে প্রক্রিয়াটি মারা যায় না:&/dev/nulldisown

COMMAND > /dev/null 2>&1 & disown

আপনার ক্ষেত্রে এটি হবে:

python program.py > /dev/null 2>&1 & disown

3

&অপারেটর আলাদা কমান্ড সমান্তরাল চালানোর জন্য, যেমনটা ;আলাদা কমান্ড সিরিজ চালানোর জন্য। উভয় ধরণের কমান্ড শেল প্রক্রিয়াটির শিশু হিসাবে এখনও চলবে

সুতরাং, যখন আপনি শেলটি বন্ধ করে দিন যা এই শিশুদের শুরু করেছিল, বাচ্চারাও বন্ধ হয়ে যাবে।

আপনি যা দেখতে চাইছেন তা হ'ল ডেমন প্রক্রিয়া , যা উল্লেখযোগ্যভাবে আরও জটিল কারণ এটি পিতামাতার প্রক্রিয়া থেকে সম্পূর্ণ আলাদা করা দরকার oc শেলটির সাধারণত এটি করার সহজ উপায় নেই।


1

আপনি লগআউট করার সময়, লগইন সেশনের সাথে সম্পর্কিত ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি সাধারণত মারা যায়। আপনি যদি এগুলি অধিবেশন থেকে সংযোগ বিচ্ছিন্ন করতে চান তবে এগুলি চালিয়ে যান nohup

nohup python program.py &

1

কমান্ডটি এম্পারস্যান্ড ( &) দিয়ে সমাপ্ত হওয়ার পরে , কমান্ড প্রম্পটে কমান্ডটি চালান bg:

bash> python program.py &  
bash> bg  

এটি পটভূমিতে "&" কমান্ডটি রাখবে

bash> jobs  

এটি পটভূমিতে চলমান কাজের তালিকা দেবে

bash> fg 1   

এটি জব # 1 সম্মুখের দিকে নিয়ে আসবে

অন্য উপায়, (লগ আউট করতে সক্ষম হতে)

bash> at now  
bash> /full/path/python /full/path/program.py  
bash> ^d   `(# That is, Control-D, to run the command, Control-C to cancel)`  

atLines d (কন্ট্রোল-ডি)
দেখার আগে একাধিক লাইন কমান্ডে জমা দেওয়া যায় man at

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