আমি ক্রোটে সমস্ত প্রক্রিয়া কীভাবে বন্ধ করব?


16

আমার বেশ কয়েকটি এলভিএম পার্টিশন রয়েছে, যার প্রত্যেকটিতে একটি উবুন্টু ইনস্টলেশন রয়েছে। মাঝেমধ্যে, আমি apt-get dist-upgradeসাম্প্রতিকতম প্যাকেজগুলিতে একটি ইনস্টলেশন আপডেট করতে একটি করতে চাই । আমি ক্রোট দিয়ে এটি করি - প্রক্রিয়াটি সাধারণত এমন কিছু হয়:

$ sudo mount /dev/local/chroot-0 /mnt/chroot-0
$ sudo chroot /mnt/chroot-0 sh -c 'apt-get update && apt-get dist-upgrade'
$ sudo umount /mnt/chroot-0

[দেখানো হয়নি: আমিও মাউন্ট এবং আনমাউন্ট /mnt/chroot-0/{dev,sys,proc}বাস্তব প্রদানকারীর সাথে যুক্ত হন-মাউন্ট হিসাবে /dev, /sysএবং/proc , যেমন Dist-আপগ্রেড এই উপস্থিত হতে আশা বলে মনে হয়]

তবে, সুনির্দিষ্টভাবে আপগ্রেড করার পরে, এই প্রক্রিয়াটি আর কাজ করে না - চূড়ান্ত সর্বশেষ ব্যর্থ হবে কারণ ফাইল /mnt/chroot-0সিস্টেমে এখনও খোলা ফাইল রয়েছে । lsofক্রুটটিতে খোলা ফাইলগুলি সহ প্রক্রিয়া রয়েছে তা নিশ্চিত করে। এই প্রক্রিয়াগুলি ডিস্ট-আপগ্রেড করার সময় শুরু হয়েছিল, আমি ধরে নিচ্ছি এটি কারণ কারণ ক্রুটে নির্দিষ্ট পরিষেবাগুলি পুনরায় চালু করা দরকার (উদাহরণস্বরূপ, এর মাধ্যমেservice postgresql restart প্যাকেজটি আপগ্রেড করার পরে )।

সুতরাং, আমি অনুমান করি যে এই ক্রুটের অভ্যন্তরে চলমান সমস্ত পরিষেবা বন্ধ করার জন্য আমাকে আপস্টার্টটি বলা দরকার। নির্ভরযোগ্যভাবে এটি করার কোনও উপায় আছে?

আমি চেষ্টা করেছিলাম:

cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'initctl' services 
initctl list | awk '/start\/running/ {print \$1}' | xargs -n1 -r initctl stop
EOF

যেখানে initctl list সঠিক কাজটি করা হচ্ছে বলে মনে হচ্ছে এবং কেবলমাত্র এই প্রক্রিয়াটিতে এই প্রক্রিয়া শুরু হয়েছে list টুমিনয়েডের পরামর্শ অনুসারে আমি এটিও যুক্ত করার চেষ্টা করেছি:

cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'service' services
service --status-all 2>/dev/null |
    awk '/^ \[ \+ \]/ { print \$4}' |
    while read s; do service \$s stop; done
EOF

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

sudo chroot /mnt/chroot-0 telinit 0

কিন্তু এই ক্ষেত্রে, init না পৃথক মূলের মধ্যে পার্থক্য এবং পুরো মেশিনটি বন্ধ করে দেয়।

সুতরাং, কোনও বিশেষ ক্রুটে সমস্ত প্রক্রিয়া বন্ধ করার জন্য আরআইআরকে বলার কোনও উপায় নেই, যাতে আমি নিরাপদে ফাইল সিস্টেমটি আনমাউন্ট করতে পারি? ক্রোমের মধ্যে বাচ্চাদের সমস্ত প্রক্রিয়া (নিয়মিত শাটডাউন করার সময় যেমন করা হত) সাইনটার / সিগিল করার কোনও উপযোগ আছে কি?


এটি আপনার আসল প্রশ্নের উত্তর নয়, তবে এটি সহায়ক হতে পারে: আমি lxc প্যাকেজটি দেখার পরামর্শ দিই। lxc কনটেইনারগুলিতে সূচনা ও পরিষ্কারভাবে বন্ধ করার সহজ সরঞ্জাম সরবরাহ করে।
আয়ন

উত্তর:


16

আমি এখানে বুদ্ধিমান অবস্থা বজায় রাখার জন্য কার্নেল ব্যতীত অন্য কিছুই বিশ্বাস করি না, সুতরাং আমি এই কাজটি করতে আরম্ভ করব না (না) আসলে আমি কী জানি বা কী করা হচ্ছে তা জানে না (কিছু প্যাকেজ) binfmt_misc এর মতো অতিরিক্ত ফাইল সিস্টেমগুলি মাউন্ট করতে পারে। সুতরাং, প্রক্রিয়া বধ করার জন্য, আমি ব্যবহার করি:

PREFIX=/mnt/chroot-0
FOUND=0

for ROOT in /proc/*/root; do
    LINK=$(readlink $ROOT)
    if [ "x$LINK" != "x" ]; then
        if [ "x${LINK:0:${#PREFIX}}" = "x$PREFIX" ]; then
            # this process is in the chroot...
            PID=$(basename $(dirname "$ROOT"))
            kill -9 "$PID"
            FOUND=1
        fi
    fi
done

if [ "x$FOUND" = "x1" ]; then
    # repeat the above, the script I'm cargo-culting this from just re-execs itself
fi

এবং ক্রাউটকে একচেটিয়া রাখার জন্য আমি ব্যবহার করি:

PREFIX=/mnt/chroot-0
COUNT=0

while grep -q "$PREFIX" /proc/mounts; do
    COUNT=$(($COUNT+1))
    if [ $COUNT -ge 20 ]; then
        echo "failed to umount $PREFIX"
        if [ -x /usr/bin/lsof ]; then
            /usr/bin/lsof "$PREFIX"
        fi
        exit 1
    fi
    grep "$PREFIX" /proc/mounts | \
        cut -d\  -f2 | LANG=C sort -r | xargs -r -n 1 umount || sleep 1
done

সংযোজন হিসাবে, আমি এটি উল্লেখ করতে পারি যে এটি একটি ডিআইআই সমস্যা হিসাবে পৌঁছানো সম্ভবত এটি দেখার পক্ষে ভুল উপায়, যদি না আপনি আসলে ক্রুটে একটি পৃথক প্রক্রিয়া এবং একটি পৃথক প্রক্রিয়া স্থান (যেমন: এলএক্সসি পাত্রে ক্ষেত্রে থাকেন) । একটি একক আরম্ভ (chroot এর বাইরে), এবং একটি ভাগ করা প্রক্রিয়া স্পেস সহ, এটি আর "আর্টের সমস্যা" নয়, বরং আপত্তিজনক পাথের জন্য যে প্রক্রিয়াগুলি ঘটে থাকে তা খুঁজে বের করার জন্য আপনার উপর নির্ভর করে, সুতরাং উপরের প্রকট পদচারণা।

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


এগুলি বুটেবল সিস্টেম, তবে policy-rc.dএকটি আকর্ষণীয় পদ্ধতির মতো দেখায় (ক্রোটের সাথে কথোপকথনের পরে আমি কেবল এটি সরিয়ে ফেলতে পারি)। এটি /etc/rc*.d- এবং- /etc/init/*.confস্টাইল উভয় কাজকেই প্রভাবিত করে ?
জেরেমি কের


Upstart বা sysvinit "নীতি-rc.d পরামর্শের পরামর্শ নিন" না, এটি আহ্বান করে - rc.d যা এটি করে, যা সমস্ত পোস্ট-ইনস্ট্রি স্ক্রিপ্টগুলি ইআর চাকরীর সাথে ইন্টারেক্ট করার জন্য ব্যবহৃত হয়। বাস্তবে, এটি ভাঙা প্যাকেজগুলির ক্ষেত্রে (যা ঠিক করা উচিত) বাদে ডিটিআরটি বলে মনে হয়। তবুও, উপরোক্ত "ফায়ার উইথ ফায়ার" স্ক্রিপ্টিংটি কাজটি করে, সমস্যাটি অতীত নীতিটি কিছুটা পিছলে চলেছে কিনা, নীতিমালা কার্যকর হচ্ছে না বা অন্য কোনও ধরণের দীর্ঘকাল ধরে চলমান প্রক্রিয়াটি প্রায় বাকি রয়েছে (এর প্রধান ব্যবহারের ক্ষেত্রে) বিল্ডসগুলি এখানে নিজেরাই বিল্ড করার সময় ব্যাকগ্রাউন্ডযুক্ত বা অন্যথায় স্বাবলম্বী থেকে অপ্রতিরোধী)।
অনন্ত

1
Utpstart এর ক্রুট সমর্থনটি নিয়ে কাজ করার চেষ্টা করার সাথে একটি সমস্যা। আমি মোটামুটিভাবে নিশ্চিত মেরেছি -9 আপস স্টার্ট নির্দিষ্ট করে রেখেছে যদি আপস্টার্ট কাজটি শ্বাস ফেলা আটকাবে না। সুতরাং জিনিসগুলি এখনও চলছে কিনা তা খুঁজে পাওয়ার জন্য আপনার সত্যিকারের ক্রুটের অভ্যন্তর থেকে উপরে উঠে জিজ্ঞাসাবাদ করা দরকার । আমি মনে করি এটি অত্যন্ত দুর্ভাগ্যজনক, এবং আমাদের এই চাকরিগুলি বন্ধ করার জন্য বাইরের গোষ্ঠী থেকে কিছুটা পথ নেওয়া উচিত। এটি বলেছে যে আমি দেখতে পাই যেখানে সূচনা / তালিকা / গ্রেপ পদ্ধতির + আপনার সম্পূর্ণ হওয়া উচিত।
স্প্যাম্যাপস

1
@ স্প্যাম্যাপস: ভাল পয়েন্ট - ম্যানুয়ালি ডিআর চাকরিগুলি হত্যার ফলে তাদের পুনরায় চালু হওয়ার ফলস্বরূপ। উপস্থাপককে ক্রোট-নির্দিষ্ট শাটডাউন সম্পাদন করতে, সংজ্ঞায়িত কাজ বন্ধ করে এবং ক্রুটের অভ্যন্তরে মূল ডিরেক্টরি রয়েছে এমন কোনও অবশিষ্ট পুনঃসংশ্লিষ্ট প্রক্রিয়াটি মেরে ফেলার কথা বলতে পেরে আপনি দুর্দান্ত হবেন।
জেরেমি কের

0

আপনি ইতিমধ্যে সমস্যাটি নিজেই চিহ্নিত করেছেন: কিছু জিনিস service ...ডিস্ট-আপগ্রেড চলাকালীন চলতে থাকে এবং serviceএটি আপস্টার্টের অংশ নয়, তবে এর অংশ sysvinitservice --status-allআপনি আপস্টার্ট পরিষেবাদির জন্য যেমন ব্যবহার করেছেন তেমন সিস্টেভিট পরিষেবা বন্ধ করতে চারপাশে অনুরূপ বুদ্ধিমান ম্যাজিক যুক্ত করুন।


3
আহ, ধন্যবাদ এটি প্রায় ভাল, কিন্তু এটি সমস্ত পরিষেবাও কভার করে না। আমি চালিয়েছি sudo chroot /mnt/chroot-0 service --list-allএবং sudo chroot /mnt/chroot-0 initctl listযা উভয়ই কোনও পরিষেবা চালু নেই বলে জানিয়েছে। তবে, /usr/bin/epmd(এরলং-বেস থেকে) এখনও চলছে।
জেরেমি কের

0

আমি জানি এই প্রশ্নটি বেশ পুরানো, তবে আমি মনে করি এটি আজকের মতোই প্রাসঙ্গিক, যেমনটি ২০১২ সালে হয়েছিল এবং আশা করি কেউ এই কোডটিকে দরকারী বলে মনে করছেন। আমি যা কিছু করছিলাম তার জন্য কোডটি লিখেছিলাম তবে ভেবেছিলাম আমি এটি ভাগ করে নিই।

আমার কোডটি ভিন্ন, তবে ধারণাগুলি @ ইনফিনিটির সাথে খুব মিল (আসলে - আমি এখন / প্রো / / / রুট সম্পর্কে জানলাম তার কারণ তার উত্তর - ধন্যবাদ @ ইনফিনিটি!)। আমি কিছু শীতল অতিরিক্ত কার্যকারিতা যুক্ত করেছি

#Kills any PID passed to it
#At first it tries nicely with SIGTERM
#After a timeout, it uses SIGKILL
KILL_PID()
{
        PROC_TO_KILL=$1

        #Make sure we have an arg to work with
        if [[ "$PROC_TO_KILL" == "" ]]
        then
                echo "KILL_PID: \$1 cannot be empty"
                return 1
        fi

        #Try to kill it nicely
        kill -0 $PROC_TO_KILL &>/dev/null && kill -15 $PROC_TO_KILL

        #Check every second for 5 seconds to see if $PROC_TO_KILL is dead
        WAIT_TIME=5

        #Do a quick check to see if it's still running
        #It usually takes a second, so this often doesn't help
        kill -0 $PROC_TO_KILL &>/dev/null &&
        for SEC in $(seq 1 $WAIT_TIME)
        do
                sleep 1

                if [[ "$SEC" != $WAIT_TIME ]]
                then
                        #If it's dead, exit
                        kill -0 $PROC_TO_KILL &>/dev/null || break
                else
                        #If time's up, kill it
                        kill -0 $PROC_TO_KILL &>/dev/null && kill -9 $PROC_TO_KILL
                fi
        done
}

ক্রুট আনমাউন্ট করা যায় না তা নিশ্চিত করতে এখন আপনি 2 টি কাজ করবেন:

ক্রুটে চলমান সমস্ত প্রক্রিয়াটি হত্যা করুন:

CHROOT=/mnt/chroot/

#Find processes who's root folder is actually the chroot
for ROOT in $(find /proc/*/root)
do
        #Check where the symlink is pointing to
        LINK=$(readlink -f $ROOT)

        #If it's pointing to the $CHROOT you set above, kill the process
        if echo $LINK | grep -q ${CHROOT%/}
        then
                PID=$(basename $(dirname "$ROOT"))
                KILL_PID $PID
        fi
done

ক্রুটের বাইরে চলমান সমস্ত প্রক্রিয়াটি মেরে ফেলুন তবে এতে হস্তক্ষেপ করুন (উদা: আপনার ক্রোট যদি / এমএনটি / ক্রুট হয় এবং ডিডি / এমএনটি / ক্রুট / টেস্টফাইলে লিখতে থাকে, / এমএনটি / ক্রোট আনমাউন্টে ব্যর্থ হয়)

CHROOT=/mnt/chroot/

#Get a list of PIDs that are using $CHROOT for anything
PID_LIST=$(sudo lsof +D $CHROOT 2>/dev/null | tail -n+2 | tr -s ' ' | cut -d ' ' -f 2 | sort -nu)

#Kill all PIDs holding up unmounting $CHROOT
for PID in $PID_LIST
do
        KILL_PID $PID
done

দ্রষ্টব্য: সমস্ত কোডকে রুট হিসাবে চালান

এছাড়াও, কম জটিল সংস্করণের জন্য, KILL_PID কে প্রতিস্থাপন করুন kill -SIGTERMবা এর সাথেkill -SIGKILL


0

jchroot : আরও বিচ্ছিন্নতা সহ একটি ক্রুট

আপনার কমান্ড কার্যকর হওয়ার পরে, এই কমান্ড কার্যকর করে যে কোনও প্রক্রিয়া শুরু হয়েছে তা হত্যা করা হবে, যে কোনও আইপিসি মুক্তি পাবে, যে কোনও মাউন্ট পয়েন্ট আনমাউন্ট হবে না। সব পরিষ্কার!

স্ক্রুট এখনও এটি করতে সক্ষম নয়, তবে এটি পরিকল্পনা করা হয়েছে

আমি ওপেনভিজেড ভিপিএসে এটি সফলভাবে পরীক্ষা করেছি, যা ডকার বা এলএক্সসি ব্যবহার করতে পারে না।

বিস্তারিত জানার জন্য লেখকের ব্লগটি পড়ুন:

https://vincent.bernat.im/en/blog/2011-jchroot-isolation.html


-1

স্ক্রুট: এটিতে সেশন ম্যানেজমেন্টের বৈশিষ্ট্য রয়েছে। আপনি যখন সেশনটি বন্ধ করবেন তখন এর সমস্ত প্রক্রিয়া মারা যায়।

https://github.com/dnschneid/crouton/blob/master/host-bin/unmount-chroot : এই স্ক্রিপ্টগুলি সমস্ত ক্রুট প্রক্রিয়াটি মেরে ফেলেছে এবং সমস্ত মাউন্ট করা ডিভাইসগুলি আনমাউন্ট করে।


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