প্রক্রিয়া বংশধরদের


20

আমি একটি প্রক্রিয়া ধারক তৈরি করার চেষ্টা করছি। ধারকটি অন্যান্য প্রোগ্রামগুলিকে ট্রিগার করবে। উদাহরণস্বরূপ - একটি বাশ স্ক্রিপ্ট যা '&' ব্যবহারের সাথে চলমান পটভূমি কাজ শুরু করে।

আমি পরে গুরুত্বপূর্ণ বৈশিষ্ট্যটি হ'ল: আমি যখন ধারকটি বধ করি, তখন এর নীচে যে সমস্ত জিনিস উত্পন্ন হয়েছিল তাকে হত্যা করা উচিত। কেবল প্রত্যক্ষ বাচ্চারা নয়, তাদের বংশধররাও।

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

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

আমার একটি ধারণা আছে যে আমি কী পছন্দ করছি তাতে ইউনিক্স সেশন জড়িত।

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


ঠিক আছে, পিতামাতার প্রক্রিয়া হত্যার ফলে SIGHUPএটি সরাসরি বাচ্চাদের প্রক্রিয়াগুলি প্রেরণ করে। হ্যাং আপ সিগন্যালের ডিফল্ট হ্যান্ডলার প্রক্রিয়াজাতকরণ বাতিল করে দেয়, তাই ডিফল্ট রুটটি সমস্ত বংশধরকে হত্যা করে kill প্রক্রিয়া এবং প্রক্রিয়া গ্রুপগুলি সম্পর্কে আরও পড়ুন।
অ্যালেক্স

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

উত্তর:


23

আপনি যদি কোনও প্রক্রিয়াতে সংকেত প্রেরণ করেন তবে সেই প্রক্রিয়াটি মারা যায়। আমি অবাক হয়েছি যে কোনও প্রক্রিয়া হত্যার ফলে যে গুজব অন্যান্য প্রক্রিয়াও হত্যা করে তা কীভাবে শুরু হয়েছিল, এটি বিশেষভাবে স্ব-স্বজ্ঞাত বলে মনে হয়।

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

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

আপনি যখন কোনও টার্মিনালটি বন্ধ করেন, কার্নেল SIGHUPসমস্ত প্রসেসকে সংকেত প্রেরণ করে যেগুলি এটির নিয়ন্ত্রণকারী টার্মিনাল হিসাবে । এই প্রক্রিয়াগুলি একটি সেশন গঠন করে তবে সমস্ত সেশনের একটি নিয়ন্ত্রণকারী টার্মিনাল থাকে না। আপনার প্রকল্পের জন্য, একটি সম্ভাবনা হ'ল স্ক্রিপ্ট , স্ক্রিন ইত্যাদির দ্বারা নির্মিত নিজের টার্মিনালে সমস্ত প্রক্রিয়া শুরু করা , এতে থাকা প্রক্রিয়াগুলি (যেগুলি তারা সিসিড করেন নি setsid) ধরে রাখার জন্য টার্মিনাল এমুলেটর প্রক্রিয়াটি হত্যা করুন ।

প্রক্রিয়াগুলি তাদের নিজস্ব ব্যবহারকারী হিসাবে চালিয়ে আপনি আরও বিচ্ছিন্নতা সরবরাহ করতে পারেন, যারা অন্য কিছু করেন না। তারপরে সমস্ত প্রক্রিয়াটিকে হত্যা করা সহজ: সেই ব্যবহারকারী হিসাবে চালান kill( সিস্টেম কল বা ইউটিলিটি ) এবং মারার জন্য পিআইডি যুক্তি হিসাবে -1 ব্যবহার করুন, যার অর্থ "সেই ব্যবহারকারীর সমস্ত প্রক্রিয়া"।

আপনি আরও বেশি বিচ্ছিন্নতা সরবরাহ করতে পারেন তবে প্রকৃত ধারকটিতে থাকা প্রক্রিয়াগুলি চালিয়ে যথেষ্ট সেটআপ দিয়ে ।


যদি আপনি নিজের প্রক্রিয়াগুলি প্রোগ্রাম করেন তবে আপনি এমন কিছু ব্যবহার করতে পারেন যেমন: prctl(PR_SET_PDEATHSIG, SIGHUP);আরও তথ্য: man7.org/linux/man-pages/man2/prctl.2.html
অ্যালেক্সিস উইলকে

গিলস, আপনি এটি উল্লেখ করেছেন - "আপনি যখন কোনও টার্মিনালটি বন্ধ করেন, কার্নেল সমস্ত প্রসেসকে তার নিয়ন্ত্রণকারী টার্মিনাল হিসাবে সংকেত SIGHUP প্রেরণ করে"। থেকে এই যারা সামনে সেশনের মধ্যে সব প্রক্রিয়া গোষ্ঠীতে তে এটি আমি টার্মিনাল surmising করছি (শেল) অধিবেশন নেতা SIGHUP পাঠায়। দুজনের মধ্যে কোনটি ঠিক হবে?
iruvar

4

মূল স্ক্রিপ্টের মধ্যেই কিল সংকেতটি ফাঁদে ফেলুন এবং এটি সমস্ত শিশুকে মেরে ফেলুন। উদাহরণ স্বরূপ,

#!/bin/bash
# kill the parent and children together
trap "kill 0" EXIT
# create all the children
for n in $(seq 1 100)
do
    ( echo "begin $n"; sleep 60; echo "end $n" ) &
done
# wait for the children to complete
wait

2

কোনও প্রক্রিয়ার সমস্ত বংশধরকে সনাক্ত করার একটি নির্ভরযোগ্য উপায় হ'ল পিডটি pstree <pid>হল আপনার প্যারেন্ট প্রসেস আইডি command

ম্যান পৃষ্ঠাটি pstree এখানে পড়ুন ।

কোনও প্রক্রিয়া গোষ্ঠীর সমস্ত সদস্যকে সিগন্যাল করার জন্য: killpg(<pgrp>, <sig>);
যেখানে পিজিআরপি হ'ল প্রক্রিয়া গ্রুপ নম্বর এবং সিগ হ'ল সিগন্যাল।

একটি নির্দিষ্ট প্রক্রিয়া গ্রুপে বাচ্চাদের জন্য অপেক্ষা করতে: waitpid(-<pgrp>, &status, ...);

আপনি যা করছেন তার বিকল্প হ'ল একটি নতুন ব্যাশ শেলের মধ্যে আপনার প্রক্রিয়া ধারকটি চালানো। কমান্ড দিয়ে নতুন ব্যাশ শেল তৈরি করুন bashএবং তারপরে আপনার প্রক্রিয়াগুলি চালান run আপনি যখন সমস্ত প্রক্রিয়া শেষ হতে চান, কমান্ডটি দিয়ে শেলটি প্রস্থান করুন exit


আমি মনে করি কিলটপিজ আমাকে যা করতে হবে তা করতে আমাকে অনুমতি দেবে। ধন্যবাদ।
ক্রেগ টার্নার

1

ব্যবহার

unshare -fp --kill-child -- yourprogram

যদি আপনি হত্যা করেন তবে unshareসমস্ত শিশু প্রক্রিয়া (এটি yourprogramফুটিয়ে উঠতে পারে) হত্যা করা হবে।

ইউজার-লিনাক্সের সাহায্যে এটি এখন সম্ভব 2.32; আমি এই প্রবাহকে বাস্তবায়ন করেছি । এটির জন্য ব্যবহারকারীর নেমস্পেসগুলি (কার্নেল কনফিগারেশন বিকল্প CONFIG_USER_NS=y) বা মূল সুবিধার প্রয়োজন। এখানেও দেখুন ।


0

rkill থেকে কমান্ড pslist প্যাকেজ সংকেত (অথবা প্রদত্ত পাঠায় SIGTERMনির্দিষ্ট প্রক্রিয়া এবং এর সমস্ত উত্তরপুরুষদের ডিফল্টরূপে):

rkill [-SIG] pid/name...

0

শেলের সমস্ত বংশধরকে মেরে ফেলার জন্য অন্য বিকল্প: jobs -p | xargs -n 1 pkill -P

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