আমি লগ আউট করার পরেও কেন আমার প্রক্রিয়া চলছে?


10

লগ ইন করার পরে ssh, আমি এই আদেশটি টাইপ করে bash:

sleep 50000000000000 &

তারপর আমি প্রক্রিয়া পেরেন্ট প্রক্রিয়া (অর্থাত, )। তারপরে টার্মিনাল উইন্ডোটি একই সাথে সংযোগ বিচ্ছিন্ন করে।kill -9sleepbash

আমি যখন আবার লগ ইন করি, আমি দেখতে পাচ্ছি যে sleepপ্রক্রিয়াটি এখনও বেঁচে আছে।

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


3
&প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে ফেলে দেবে (ডেমনের মতো) এবং আপনি লগ আউট হয়ে গেছেন এমন ইভেন্ট চলতে থাকবে।
আইজউদ্দিন জালি

উত্তর:


6

TL; ড:

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

যদি না bashউদাহরণস্বরূপ দ্বারা উত্পন্ন হওয়া sshগেছে huponexitবিকল্প সেট, কোন প্রক্রিয়া নির্গম উপর কোন মানে দ্বারা সমাপ্ত হবে / লগআউট, এবং যখন huponexitবিকল্প সেট করা থাকে, ব্যবহার kill -9শেল উপর ব্যবহার করার জন্য একটি ভাল বিকল্প নয় nohupশেল-এর শিশু প্রক্রিয়ার উপর; nohupশেলের শিশু প্রসেসগুলি এখনও তাদের শেল থেকে আগত সিগাপগুলি থেকে রক্ষা করবে এবং এটি যখন গুরুত্বপূর্ণ nohupনয় তখনও তাকে অগ্রাধিকার দেওয়া প্রয়োজন কারণ এটি শেলটি নিখুঁতভাবে শেষ করতে দেয়।


ইন bashএকটি বিকল্প বলা আছে huponexitযা যদি সেট করা হবে, bashSIGHUP প্রস্থান / লগ-আউট উপর তার সন্তানদের ধ্বংস

ইন্টারেক্টিভ অ-লগইন bash দৃষ্টান্তগুলিতে যেমন একটি bashউদাহরণস্বরূপ উত্সাহিত হয়েছে gnome-terminal, এই বিকল্পটিকে উপেক্ষা করা হবে; কিনা huponexitসেট করা থাকে অথবা সেট না, bashএর শিশুদের দ্বারা SIGHUPped হবে না bashপ্রস্থান উপর;

ইন্টারেক্টিভ লগইন bash দৃষ্টান্তগুলিতে, যেমন একটি bashউদাহরণস্বরূপ উত্সাহিত উদাহরণস্বরূপ ssh, এই বিকল্পটি উপেক্ষা করা হবে না (তবে এটি ডিফল্টরূপে সেট করা নেই); যদি huponexitসেট bashকরা bashথাকে তবে প্রস্থান / লগআউট করার পরে বাচ্চাদের সাইন আপ করা হবে ; যদি huponexitসেট bashনা করা থাকে bashতবে প্রস্থান / লগআউট করার পরে বাচ্চাদের সাইনআপ করা হবে না ;

সুতরাং সাধারণভাবে একটি ইন্টারেক্টিভ লগইন ইভেন্ট থেকে প্রস্থান / লগ আউট bash, huponexitবিকল্পটি সেট না করা থাকলে শেলটিকে তার বাচ্চাদের SIGHUP করবে না এবং ইন্টারেক্টিভ নন-লগইন ইভেন্ট থেকে প্রস্থান / লগ আউট bashশেলটিকে তার শিশুদের সাইনআপ করবে না নির্বিশেষে;

এটি অবশ্য এই ক্ষেত্রে অপ্রাসঙ্গিক: ব্যবহার kill -9 sleepনির্বিশেষে বেঁচে থাকবে, কারণ এর পিতামাতার প্রক্রিয়াটি হত্যার ফলে পূর্ববর্তীকে কিছু করার bashসুযোগ ছেড়ে যায় না (উদাহরণস্বরূপ, যদি বর্তমান উদাহরণটি লগইন দৃষ্টিকোণ ছিল এবং বিকল্পটি সেট করা হয়েছিল, এটিতে স্বাক্ষর করতে)।bashbashhuponexit

এটি যোগ করার সাথে সাথে, অন্যান্য সিগন্যালের বিপরীতে (যেমন একটি SIGHUP সিগন্যাল প্রেরণ করা হয়েছিল bash), একটি সিগ্কিল সিগন্যাল কখনই কোনও প্রক্রিয়ার শিশু প্রক্রিয়াগুলিতে প্রচারিত হয় না, তাই sleepএমনকি হত্যা করা হয় না;

nohupSIGHUP সিগন্যালের প্রতিরোধ প্রক্রিয়া শুরু করে, যা কিছু আলাদা; এটি একটি SIGHUP সিগন্যাল গ্রহণের পরে প্রক্রিয়াটিকে ঝুলিয়ে রাখবে, যা এই ক্ষেত্রে বিকল্প সেট করা এবং শেলটি সরে যাওয়ার bashক্ষেত্রে ইন্টারেক্টিভ লগইন উদাহরণের দ্বারা গ্রহণ করা যেতে পারে huponexit; সুতরাং প্রযুক্তিগতভাবে আনসেট অপশনটি দিয়ে nohupইন্টারেক্টিভ লগইন bashইভেন্টে একটি প্রক্রিয়া শুরু huponexitকরার জন্য প্রক্রিয়াটি একটি সিএইচএইচপি সংকেত গ্রহণের পরে প্রক্রিয়াটিকে আটকাতে বাধা দেবে, তবে শেলটি থেকে বের হওয়া / লগ আউট নির্বিশেষে এটি সাইনআপ করবে না;

সাধারণভাবে, তবে, যখন nohupঅভিভাবক শেল থেকে আসা সিএইচএইচপি সংকেতগুলি রোধ করার প্রয়োজন হয় , তখন সন্তানের পদ্ধতিতে kill -9পিতামাতার পদ্ধতিতে পছন্দ করার কোনও কারণ নেই nohup; পরিবর্তে, এটি বিপরীত হওয়া উচিত।

kill -9পদ্ধতিটি ব্যবহার করে পিতামাতাকে হত্যা করা পিতামাতার পক্ষে নিখুঁতভাবে প্রস্থান করার সুযোগ ছেড়ে দেয় না, যখন nohupপদ্ধতিটি ব্যবহার করে শিশুটি শুরু করে তখন পিতামাতাকে সিগহুপের মতো অন্যান্য সিগন্যালগুলি দিয়ে শেষ করে দেওয়া যায় (যা একটি উদাহরণ তৈরি করে যা প্রসঙ্গে বোঝায় কোনও সন্তানের ব্যবহার শুরু করেছেন nohup), যা এটিকে সুদৃ .়ভাবে প্রস্থান করতে দেয়।


অন্য কথায়, আমার কাছে যদি কোনও স্ক্রিপ্ট থাকে যা ব্যাকগ্রাউন্ডে রাখা হয়েছিল, আমি এখনও পিতামাতার প্রক্রিয়াটি মেরে ফেলব তা এখনও চলবে, যেমন আমার শেলটি ঠিক? এই স্ক্রিপ্টটি মেরে ফেলার উপায় কী হবে?
সের্গেই কোলোডিয়াযনি

@ সার্জ যদি আপনার পিআইডি থাকে তবে কেবল পিআইডি মেরে ফেলুন; আপনি যদি পিআইডি সঞ্চয় না করে থাকেন তবে আপনি তাঁর নামে প্রক্রিয়াটি সনাক্ত করতে পারেন, পিআইডি সহ প্রসেসটি ps -e | grep processতালিকাভুক্ত করা উচিত (বা pgrep -x processআপনি যদি সেই একক প্রক্রিয়াটির সাথে মেলে নিশ্চিত হন এবং অযাচিত বিষয়গুলি নিশ্চিত না হন তবে) আরও ভাল); সমস্যাটি হ'ল আপনি যখন কোনও প্রক্রিয়া মারা যান kill -9বাচ্চাদের মালিকানাধীন হয়ে যান upstart, সুতরাং তাদের আসল পিপিআইডি হারিয়ে যায় এবং তাদের পিপিআইডি পরিবর্তিত হয় পিএসআইডি-তে পরিবর্তিত হয়ে তাদের অচেনা (এএফএআইকে) করে তবে তাদের নাম বা পিআইডি
কোস

@ কোস কোন শর্তের অধীনে nohupপিতামাতার প্রক্রিয়া থেকে একটি সিএইচএইচপি সংকেত পাওয়ার পরে কোনও প্রক্রিয়া ঝুলতে আটকাতে ব্যর্থ হবে? আমি ব্যাকগ্রাউন্ডে (একটি পিটিটি এসএসএইচ শেল টার্মিনালে) একটি প্রক্রিয়া চালানোর চেষ্টা করছি nohup <command> <arg> &। আমি পুটি Xবাটনে ক্লিক করে যখন লগআউট করব , তখনই পটভূমি প্রক্রিয়াটি অবিলম্বে শেষ হয়ে যাবে। আমি exitপুটি এসএসএইচ শেল টার্মিনালে টাইপ করে লগআউট করার পরে , প্রক্রিয়াটি পটভূমিতে চলতে থাকবে।
ইউজারপাল

3

bashডিফল্টরূপে প্রস্থান করার সময় শিশু প্রসেসগুলিতে HUP সংকেত পাঠায় না । আরও বিশদে (ধন্যবাদ @ কোস), এটি লগ-ইন শেলগুলির জন্য কখনই করে না ।

বিকল্পটি সেট করা থাকলে আপনি লগইন শেলগুলির জন্য এটি করতে বাশকে কনফিগার করতে পারেন huponexit। একটি টার্মিনালে, করুন:

[romano:~] % bash -l

(এটি একটি নতুন "লগইন" শেল শুরু করুন)

romano@pern:~$ shopt -s huponexit
romano@pern:~$ sleep 1234 &
[1] 32202
romano@pern:~$ exit
logout

এখন sleepপ্রক্রিয়াটি পরীক্ষা করুন :

[romano:~] % ps augx | grep sleep
romano   32231  0.0  0.0  16000  2408 pts/11   S+   15:23   0:00 grep sleep

... চলছে না: এটি HUP সিগন্যাল পেয়েছে এবং অনুরোধ অনুসারে প্রস্থান করেছে।


@kos --- হ্যাঁ, আপনি ঠিক কিন্তু ... তাই যদি আমি কেন বাঁচে? লক্ষ্য করুন যে আমি যদি প্রক্রিয়া করি তবে এটি প্রস্থান করবে । এমনকি সেট করা থাকলেও বেঁচে থাকে। বিভ্রান্ত ... (আমি আরও ভালভাবে বোঝার চেষ্টা করব এবং আরোহীদের সংশোধন করব, অন্যথায় আমি এটি মুছব)। sleep 1000 & ; exitsleepkill -HUPsleephuponexitsleep
রোমানো

2

যদি sleepএইভাবে বাঁচতে পারি, তবে এর অর্থ যদি আমি nohupআদেশের পরিবর্তে এই পদ্ধতিটি ব্যবহার করতে পারি ?

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


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

আপনার ক্ষেত্রে যা ঘটে:

এর মূল প্রক্রিয়াটি sleepবর্তমানে চলমান bashশেল shell আপনি যখন kill -9এই ব্যাশটি করেন, তখন ব্যাশ প্রক্রিয়াটি SIGHUPতার শিশু প্রসেসের কোনওটিতে প্রেরণের সুযোগ পায় না , কারণ SIGKILL(যা প্রেরণ করা হয় kill -9) প্রক্রিয়াটি ক্যাচ করার যোগ্য নয়। ঘুম প্রক্রিয়া চলমান। ঘুম এখন একটি অনাথ প্রক্রিয়া হয়ে ওঠে ।

Init (পিআইডি 1) প্রক্রিয়া রিটার্নিং নামক একটি প্রক্রিয়া করে। এর অর্থ এই যে আরম্ভ প্রক্রিয়া এখন সেই অনাথ প্রক্রিয়ার পিতামাতায় পরিণত হয়। আরআইএম একটি ব্যতিক্রম, প্রসেসগুলি তাদের শিশু হিসাবে পরিণত হতে পারে কারণ এটি তাদের মূল পিতামহীন প্রক্রিয়া হারিয়ে যাওয়া প্রক্রিয়াগুলি সংগ্রহ করে। বিটিডব্লিউ: sshd"পটভূমিতে যাওয়ার সময়" একটি ডেমন (পছন্দ করে ) তা করে।

যদি তা পুরোপুরি না ঘটে তবে এতিম প্রক্রিয়াটি পরে (শেষ হলে) একটি জম্বি প্রক্রিয়াতে পরিণত হবে। যখন waitpid()ডাকা হয় না তখন এটি ঘটে (পিতামাতার প্রক্রিয়াটির একটি দায়িত্ব যা সেই প্রক্রিয়াটি মারা যাওয়ার পরে পূর্ণ হতে পারে না)। waitpid()জম্বি বাচ্চাদের এড়াতে আরআইএম একটি নির্দিষ্ট বিরতিতে কল করে।


প্রক্রিয়াটি এমনকি TERMবাHUP
হিমাইল

@heemayl hup শাঁস কনফিগ নির্ভর করে: huponext। এবং TERM ঘুম শেষ না হওয়া পর্যন্ত অপেক্ষা করবে। ওপিএস স্লিপ কমান্ডের ক্ষেত্রে এটি হাজার হাজার বছর হবে =)
বিশৃঙ্খলা

1

&ব্যাকগ্রাউন্ডে প্রক্রিয়া শুরু হয়। আপনি যদি টাইপ করেন ps -efতবে দেখতে পাবেন যে আপনার ঘুমের প্যারেন্ট প্রসেস আইডি (পিপিআইডি) হ'ল আপনার বাশ। তারপরে লগআউট করে আবার লগইন করুন। আপনার লগআউট করার পরে প্রক্রিয়াটি চলমান থাকবে। দ্বিতীয়বার লগইন করার পরে আপনি ps -efআবার দৌড়াবেন । আপনি দেখতে পাবেন যে এখন আপনার ঘুম প্রক্রিয়ার অভিভাবক আইডি "1" দিয়ে প্রক্রিয়া করবেন। এটি init, সমস্ত প্রক্রিয়ার পিতা-মাতা।


0

ব্যবহারের &ফলে ব্যাকগ্রাউন্ড হিসাবে চলমান প্রোগ্রাম তৈরি হবে। পটভূমিতে প্রোগ্রামটি দেখতে bgকমান্ডটি ব্যবহার করতে এবং এটিকে আবার অগ্রভাগ হিসাবে চালিত করতে চালনা করুন fg

হ্যাঁ, প্রোগ্রামটি চলমান রাখার অনেকগুলি উপায় এমনকি মূল টার্মিনালটি থেকে বেরিয়ে আসা পর্যন্ত রয়েছে।


ধন্যবাদ। ব্যাশের ম্যান পেজটি কিছুটা বিভ্রান্তিকর। এটা যে বলেন: "প্রস্থান করার পূর্বে, একটি ইন্টারেক্টিভ শেল সব কাজ SIGHUP resends, দৌড়ানো বা বন্ধ করে দেয়।" কিন্তু আসলে, শেল কেবল SIGHUP পাঠাতে forground কাজ। ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিতে SIGHUP সিগন্যাল পাওয়ার কোনও সুযোগ নেই (যদি না 'huponexit' শেল বিকল্পগুলি পরিবর্তন না করা হয়)
tom_cat

@ কোস সম্ভবত আপনি ঠিক আছেন। আমি এই পোস্টটি থেকে উপরোক্ত উপসংহার টানছি : stackoverflow.com/questions/4298741/… এখন, আমি নিজেকে আরও বিভ্রান্ত করি।
tom_cat

@ টম_ক্যাট এ সম্পর্কে আবার দুবার চিন্তা করে ফিরে আসুন: অগ্রভাগ প্রক্রিয়া চলার সাথে শেলটি প্রস্থান করতে পারে এমন কোনও ঘটনা নেই , এটি সইগআপ বা অন্য কিছু হতে পারে, তবে এটি বের হচ্ছে না । সুতরাং এটি সঠিক, এটি কেবল ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিতে প্রযোজ্য, কারণ বিপরীতে কোনও অর্থবহ হবে না। তবে আরও গবেষণা থেকে মনে রাখবেন যে huponexitশুধুমাত্র লগইন শেলগুলিতে কাজ করে যেমন শেলের মাধ্যমে প্রাপ্ত শেল ssh(এবং না বলে বলুন যে মাধ্যমে প্রাপ্ত শেলের মধ্যে gnome-terminal
দিয়েছি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.