এমন কোনও ইউনিক্স বৈকল্পিক রয়েছে যার ভিত্তিতে একটি শিশু প্রক্রিয়া তার পিতামাতার সাথে মারা যায়?


41

আমি বেশ কিছুদিন ধরে লিনাক্স কার্নেল আচরণটি অধ্যয়ন করছি এবং এটি আমার কাছে সর্বদা স্পষ্ট ছিল:

যখন কোনও প্রক্রিয়া মারা যায়, initঅবশেষে মারা না যাওয়া পর্যন্ত তার সমস্ত শিশুদের প্রক্রিয়াতে ফিরে দেওয়া হয় (পিআইডি 1)।

তবে, সম্প্রতি, কার্নেলের সাথে আমার চেয়ে অনেক বেশি অভিজ্ঞ ব্যক্তি আমাকে বলেছিলেন:

যখন কোনও প্রক্রিয়াটি প্রস্থান করে, এর সমস্ত শিশুও মারা যায় (আপনি যদি না ব্যবহার NOHUPকরেন তবে তারা ফিরে যেতে পারে init)।

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

int main(void){
    printf("Father process spawned (%d).\n", getpid());
    sleep(5);

    if(fork() == 0){
        printf("Child process spawned (%d => %d).\n", getppid(), getpid());
        sleep(15);
        printf("Child process exiting (%d => %d).\n", getppid(), getpid());
        exit(0);
    }

    sleep(5);
    printf(stdout, "Father process exiting (%d).\n", getpid());
    return EXIT_SUCCESS;
}

এখানে psপ্রতিটি বারের সাথে যুক্ত ফলাফলের সাথে প্রোগ্রামটির আউটপুট দেওয়া হচ্ছে printf:

$ ./test &
Father process spawned (435).

$ ps -ef | grep test
myuser    435    392   tty1    ./test

Child process spawned (435 => 436).

$ ps -ef | grep test
myuser    435    392   tty1    ./test
myuser    436    435   tty1    ./test

Father process exiting (435).

$ ps -ef | grep test
myuser    436    1     tty1    ./test

Child process exiting (436).

এখন, আপনি দেখতে পাচ্ছেন, এটি যেমনটি প্রত্যাশা করতাম তেমন আচরণ করে। এতিম প্রক্রিয়া (436) initএটি মারা না হওয়া পর্যন্ত (1) এ ফিরিয়ে দেওয়া হয় ।

তবে, ইউনিক্স-ভিত্তিক এমন কোনও ব্যবস্থা আছে যার উপর এই আচরণটি ডিফল্টরূপে প্রয়োগ হয় না? এমন কোনও ব্যবস্থা আছে যার উপরে কোনও প্রক্রিয়া মারা যাওয়ার সাথে সাথেই তার সমস্ত শিশুদের মৃত্যুর কারণ হয়?

উত্তর:


68

যখন কোনও প্রক্রিয়াটি প্রস্থান করে, এর সমস্ত শিশুও মারা যায় (আপনি যদি NOHUP না ব্যবহার করেন তবে সে ক্ষেত্রে তারা পুনরায় আরম্ভ হয়)।

এটা ভুল. মৃত ভুল. যে ব্যক্তি এটি বলছে তা ভুল হয়েছে, বা সাধারণ পরিস্থিতি নিয়ে কোনও নির্দিষ্ট পরিস্থিতিকে বিভ্রান্ত করেছে।

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

শেল থেকে nohupএইচপি সিগন্যালের দ্বিতীয় উত্সটি ভেঙে একটি কাজ শুরু করা কারণ কাজটি তখন সিগন্যালটিকে উপেক্ষা করবে এবং টার্মিনাল অদৃশ্য হয়ে যাওয়ার পরে তাকে মরতে বলা হবে না। শেল থেকে চাকরিতে HUP সিগন্যালের প্রচার ছিন্ন করার অন্যান্য উপায়গুলির মধ্যে শেলের বিল্টিন ব্যবহার disownথাকলে এটি (চাকরির কাজ শেলের তালিকা থেকে বাদ দেওয়া হয়) এবং ডাবল ফর্কিং (শেলটি একটি শিশু প্রবর্তন করে যা একটি শিশু প্রবর্তন করে) এর নিজস্ব এবং তাত্ক্ষণিকভাবে প্রস্থান করা; শেলটির নাতি-নাতীর কোনও জ্ঞান নেই)।

আবার, টার্মিনালে শুরু হওয়া কাজগুলি তাদের পিতামাতা প্রক্রিয়া (শেল) মারা যাওয়ার কারণে নয়, কারণ তাদের পিতামাতার প্রক্রিয়া যখন তাদের হত্যা করার কথা বলা হয় তখন তাদের হত্যা করার সিদ্ধান্ত নেয়। এবং টার্মিনালের প্রাথমিক শেলটি মারা যায় না কারণ এর প্যারেন্ট প্রসেসটি মারা যায়, তবে এটির টার্মিনালটি অদৃশ্য হয়ে যায় (যা কাকতালীয়ভাবে হতে পারে বা নাও হতে পারে কারণ টার্মিনালটি টার্মিনাল এমুলেটর দ্বারা সরবরাহ করা হয় যা শেলের মূল প্রক্রিয়া)।


1
তৃতীয় উপায় আছে, নিয়ন্ত্রণ গোষ্ঠীগুলির সাথে কিছু। আমি কেবল জানি, সিস্টেমড ক্লিন কিলস প্রয়োগ করতে এটি ব্যবহার করে।
o11c

5
@ জানহুদেক আমি মনে করি আপনি বিভ্রান্ত nohupকরছেন disowndisownকিছু শেলের একটি অন্তর্নির্মিত যা কাজের টেবিল থেকে একটি চলমান কাজ সরিয়ে দেয় (যেমন একটি যুক্তি গ্রহণ করে %1), এবং এর প্রধান কার্যকর পার্শ্ব প্রতিক্রিয়া হ'ল শেলটি সাবপ্রসেসে একটি সিএইচএইচপি প্রেরণ করবে না। nohupএকটি বাহ্যিক ইউটিলিটি যা SIGHUP উপেক্ষা করে (এবং আরও কয়েকটি কাজ করে) তারপরে তার কমান্ড লাইনে পাস হওয়া আদেশটি শুরু করে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলস: না, আমি ছিলাম না, তবে স্ট্রেসের দিকে তাকানো কমান্ড nohupদেওয়ার আগে সিগন্যালটিকে উপেক্ষা করবে exec
জানু হুডেক

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ! আমি বিশেষত মডেম হ্যাং আপ সম্পর্কিত historicalতিহাসিক পটভূমির সামান্য কিছু পছন্দ করেছি। আমি উদ্বিগ্ন হতে শুরু করেছিলাম যে এতক্ষণ আমি কার্নেলটি ভুল
জন ডাব্লুএইচ স্মিথ

3
এছাড়াও লক্ষ করা উচিত যে কোনও প্রোগ্রাম যখন সাইনহুপটি গ্রহণ করে তখন প্রস্থান করে কারণ সাইনআপের জন্য ডিফল্ট সিগন্যাল হ্যান্ডলারটি প্রস্থান করতে হয়। তবে যে কোনও প্রোগ্রাম তার নিজস্ব সিগআপ হ্যান্ডলারটি প্রয়োগ করতে পারে যা প্যারেন্ট শেল যখন এটি সাইনআপ পাঠায় তখন এটি প্রস্থান না হতে পারে it
slebetman

12

যখন কোনও প্রক্রিয়াটি প্রস্থান করে, এর সমস্ত শিশুও মারা যায় (আপনি যদি NOHUP না ব্যবহার করেন তবে সে ক্ষেত্রে তারা পুনরায় আরম্ভ হয়)।

প্রক্রিয়াটি সেশন লিডার হলে এটি সঠিক। যখন একটি সেশনের নেতা মারা যান, তখন সেশনটির সমস্ত সদস্যদের জন্য একটি সিএইচএইচইপি প্রেরণ করা হয়। অনুশীলনে এর অর্থ এর সন্তান এবং তাদের বংশধর।

একটি প্রক্রিয়া কল করে নিজেকে অধিবেশন নেতা করে তোলে setsid। শেল এটি ব্যবহার করে।


আমি এই সম্পর্কে কেবল একটি পরীক্ষা চালিয়েছি, তবে আপনি যে আচরণটি বর্ণনা করছেন তা আমি পুনরুত্পাদন করতে পারিনি ... আমি একটি প্রক্রিয়া তৈরি করেছি, এটিকে একটি নতুন অধিবেশন দিয়েছি ( fork, পিতামাতার প্রক্রিয়াটি মেরে ফেলেছি setsid), এবং এই নতুন অধিবেশনটিতে অন্য একটি শিশুকে জোর দিয়েছি । যাইহোক, যখন প্যারেন্ট প্রসেস (নতুন অধিবেশন লিডার) মারা যায়, তখন শিশুটি কোনও সিএইচইপআপ পায়নি, এবং initঅবশেষে এটি বের না হওয়া অবধি তার সাথে যুক্ত হয়ে যায়।
জন ডাব্লু এইচ স্মিথ

ম্যানপেজ থেকে setpgid(2): যদি কোনও সেশনের একটি নিয়ন্ত্রণকারী টার্মিনাল থাকে এবং সেই টার্মিনালের জন্য CLOCAL পতাকা সেট না করা থাকে এবং একটি টার্মিনাল হ্যাঙ্গআপ হয়, তবে সেশন লিডারকে একটি SIGHUP প্রেরণ করা হয়। যদি সেশন লিডারটি প্রস্থান করে, তবে নিয়ন্ত্রণকারী টার্মিনালের অগ্রভাগ প্রক্রিয়া গোষ্ঠীর প্রতিটি প্রক্রিয়াতে একটি সিগআপ সিগন্যাল প্রেরণ করা হবে।
নিনজালজ

1
@ নিনজালজ তখন আমি অনুমান করছি যে উত্তরটি বৈধ কিনা এবং কেবলমাত্র যদি সেশন লিডার কোনও টার্মিনালের নিয়ন্ত্রণ প্রক্রিয়া হয়। কোনও স্ট্যান্ডার্ড সেশন লিডার, যে কোনও টার্মিনাল থেকে স্বাধীন, তার বাচ্চাদের হত্যা করবে না। এটা কি সঠিক?
জন ডব্লিউ এইচ স্মিথ

-1

সুতরাং উপরের পোস্টারগুলি যা বলছে তা হ'ল, বাচ্চারা মারা যায় না, পিতামাতারা তাদের হত্যা করে (বা তাদের সিগন্যাল প্রেরণ করে যা তারা শেষ করে)। সুতরাং আপনি যা চান তা আপনি পেতে পারেন, যদি আপনি পিতামাতাকে প্রোগ্রাম করেন (1) এর সমস্ত শিশুদের একটি রেকর্ড রাখুন এবং (2) এর সমস্ত বাচ্চাদের কাছে একটি সংকেত প্রেরণ করুন।

শেল এটিই করে এবং এটি আপনার পিতামাতার প্রক্রিয়াটি হওয়া উচিত। পিতামাতার মধ্যে এইচইউপি সিগন্যাল ধরা প্রয়োজন হতে পারে তাই আপনার বাচ্চাদের হত্যা করার যথেষ্ট নিয়ন্ত্রণ রয়েছে।


অনেক কারণ পিতামাতাকে মরতে পারে। উদাহরণস্বরূপ, পিতামাতার যদি সিকিল্ড থাকে তবে বাচ্চাদের বেঁচে যাওয়া রোধ করার কোনও উপায় নেই।
এমিল জেবেক

-1

আমি মৃত পিতা-মাতার সাথে সামান্য সম্পর্কিত জবাবগুলিতে কিছুটা মিস করছি: যখন কোনও প্রক্রিয়া এমন পাইপে লেখায় যার জন্য পড়াশোনার আর কোনও প্রক্রিয়া নেই, তখন এটি একটি সাইনপাইপ পায়। SIGPIPE এর জন্য মানক ক্রিয়া সমাপ্তি।

এটি প্রকৃতপক্ষে প্রক্রিয়াগুলিকে মারা যেতে পারে। আসলে, এটি স্ট্যান্ডার্ড পদ্ধতিতে প্রোগ্রামটি yesমারা যায়।

যদি আমি মৃত্যুদণ্ড কার্যকর করি

(yes;echo $? >&2)|head -10

আমার সিস্টেমে, উত্তরটি হল

y
y
y
y
y
y
y
y
y
y
141

এবং 141 হ'ল সত্যই 128 + সংকেত:

   SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                 readers

থেকে man 7 signal


2
তবে পাইপ থেকে প্রক্রিয়াটি পড়া প্রয়োজনীয়ভাবে (বা এমনকি সাধারণত) এর পিতামাতার নয় isn't সুতরাং প্রশ্নটি যা জিজ্ঞাসা করছে তার থেকে এটি সত্যিই একটি খুব আলাদা কেস।
বার্মার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.