কোনও স্ক্রিপ্ট মেশিনটিকে রিবুট করার পরে কীভাবে চালিয়ে যেতে হবে?


18

আমি বাশে শেল স্ক্রিপ্ট লিখছি। স্ক্রিপ্টের এক পর্যায়ে এটি সনাক্ত করে যে চালিয়ে যাওয়ার আগে মেশিনটি পুনরায় বুট করা দরকার। এটি ইস্যু করে:

sudo reboot

যখন মেশিনটি ফিরে আসবে তখন আরও অনেক কাজ রয়েছে যা এই স্ক্রিপ্টটির করা দরকার। এই স্ক্রিপ্টে কাজ চালিয়ে যেতে আমি কীভাবে কিছু কনফিগার করব?

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

এই স্ক্রিপ্টটি কেবল একবার চালানো দরকার, প্রতিটি রিবুট নয়। সুতরাং এটি অন্য কোথাও যেতে হবে যা কেবলমাত্র পরবর্তী রিবুটটিতে চলে, বা একবার চালানোর পরে নিজেকে সরাতে সক্ষম হবে।

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

আমার নির্দিষ্ট সংস্করণটি উবুন্টু লিনাক্স 14.04। আসল স্ক্রিপ্টটি কমান্ড লাইনে সিস্টেম অ্যাডমিনিস্ট্রেটর দ্বারা শুরু করা হয়েছিল (ক্রোন থেকে চলার বিপরীতে)।


কোনও স্ক্রিপ্টের মধ্যে একটি রিবুট কেবল তখনই ব্যবহার করা উচিত যদি আপনি এটি এড়াতে না পারেন। উদাহরণস্বরূপ একটি নতুন কার্নেল ইনস্টলেশন। আমি নিশ্চিত আপনি পুনরায় বুট না করেই আপনার কাজটি করতে পারবেন। আপনি কেন পুনরায় বুট প্রয়োজন তা নির্দিষ্ট করতে পারেন?
বিশৃঙ্খলা

1
এই স্ক্রিপ্টটিতে একটি নতুন কার্নেল ইনস্টল করা হয়েছে (বা বরং এটি আপগ্রেড কল করবে যা এটি করতে পারে)। এটি পুনরায় বুট করার আগে পুনরায় বুট করার দরকার আছে কিনা তাও পরীক্ষা করে।
স্টিফেন অস্টেরমিলার

"কোনও স্ক্রিপ্টের মধ্যে একটি রিবুট কেবল তখনই ব্যবহার করা উচিত যদি আপনি এটি এড়াতে না পারেন" " - @ চাওস কেন?
জন রেড

উত্তর:


16

একটি সিস্টেমে, কেবলমাত্র একটি বিষয় যা সত্যই অধ্যবসায়ী হয় তা হ'ল ফাইল। এটি আপনার ব্যবহার করা উচিত যা অনেক বেশি। একটি init.d স্ক্রিপ্ট ব্যবহার করে একটি সমাধান এখানে।

আসুন নিম্নলিখিত (সরল) লিপিটি বিবেচনা করুন /etc/init.d/myupdate:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
        /path/to/update/script
        ;;
    stop|restart|reload)
        ;;
esac

আপনি যদি এটি দিয়ে সক্রিয় করেন তবে বুট update-rc.d myupdate defaultsকরার পরে startক্রিয়াটি কার্যকর করা হবে। এখন, যখন আপনার আপডেট স্ক্রিপ্ট পুনরায় বুট করার জন্য কল করে:

touch /var/run/rebooting-for-updates
sudo reboot

এই সমাধানের সাহায্যে আপনি আপনার আপডেট স্ক্রিপ্টটি দুটি ভাগে ভাগ করতে পারেন:

before_reboot(){
    # Do stuff
}

after_reboot(){
    # Do stuff
}

if [ -f /var/run/rebooting-for-updates ]; then
    after_reboot
    rm /var/run/rebooting-for-updates
    update-rc.d myupdate remove
else
    before_reboot
    touch /var/run/rebooting-for-updates
    update-rc.d myupdate defaults
    sudo reboot
fi

এটি before_rebootকোড বিভাগটি কার্যকর করবে , একটি ফাইল তৈরি করবে /var/runএবং পুনরায় বুট করবে। বুট করার পরে, স্ক্রিপ্টটি আবার কল করা হবে, তবে যেহেতু ফাইলটি বিদ্যমান রয়েছে, after_rebootতার পরিবর্তে কল করা হবে before_reboot

নোট যাতে update-rc.dমূল অধিকার প্রয়োজন।

কোনও ফাইল ব্যবহার না করেই ( স্টিফেন অস্টেরমিলারের মন্তব্য থেকে):

আপনি যদি getoptsইউটিলিটির সাথে পরিচিত হন তবে আপনি ফাইলগুলির পরিবর্তে বিকল্পগুলি ব্যবহার করতে চাইতে পারেন। আরআর স্ক্রিপ্টে স্ক্রিপ্টটি কল করুন:

/path/to/update/script -r

এবং আপনার স্ক্রিপ্টে, ফাইলগুলির পরিবর্তে বিকল্পগুলির জন্য পরীক্ষা করুন। বিকল্প ছাড়াই একবার আপনার স্ক্রিপ্ট কল করুন, এবং init.d এবার বুট এ আবার কল করবে -r

# Set AFTER_REBOOT according to options (-r).

if [ "x$AFTER_REBOOT" = "xyes" ]; then
    # After reboot
else
    # Before reboot
fi

অপশন হ্যান্ডলিং সম্পর্কিত আরও তথ্য আপনি এখানে পাবেন (কেবল সংক্ষিপ্ত বিকল্পের জন্য)update-rc.dএটিকে এককালীন কাজ রাখার জন্য কল সহ আমার স্ক্রিপ্টটিও সম্পাদনা করেছি (অন্য মন্তব্য থেকে)।


2
একে ডাকতে সহজ হতে পারে /path/to/update/script --after-rebootথেকে /etc/init.d/myupdateউপস্থিতিতে উপর ভরসা করার চেয়ে বরং /var/run/rebooting-for-updates। তারপরে বুট এ সরাসরি বনাম কল করা হলে এটির বিভিন্ন যুক্তি থাকতে পারে।
স্টিফেন অস্টেরমিলার

খুব ভাল, বিকল্পগুলি সম্পর্কে ভাবেনি। আমাকে সম্পাদনা করার অনুমতি দিন;)
জন ডব্লিউ এইচ স্মিথ

1
এছাড়াও, যেহেতু এটি এক সময়ের কাজ, আমি সম্ভবত স্ক্রিপ্টটিতে update-rc.d myupdate defaultsএবং যুক্ত করতে এবং update-rc.d myupdate removeপাশাপাশি রচনা এবং অপসারণটি চাই /etc/init.d/myupdateযাতে এটি ফাইলগুলি চারপাশে বসে না।
স্টিফেন অসটারমিলার

আমি এটি বাস্তবায়ন করেছি এবং এটি ভালভাবে কাজ করে। কেবলমাত্র আমি যুক্ত করব যে আমার দেবিয়ান ভিত্তিক সিস্টেমটি INIT INFOবিভাগে অতিরিক্ত আইটেমগুলির প্রয়োজন : উইকি.ডেবিয়ান.আর
স্টিফেন অসটারমিলার

আমি সত্যিই এটি সহজ রাখতে চেয়েছিলাম;) যথাযথ init.d লিখতে একটু সময় লাগে, তবুও আপনি আরও তথ্যের জন্য গেছেন বলে আমি আনন্দিত: এই স্ক্রিপ্টগুলি বেশ কার্যকর হতে পারে।
জন ডব্লিউ এইচ স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.