লিনাক্স: পুনরায় বুট করার পরে একবার চালানোর জন্য সিডিউল কমান্ড (রানআউন্স সমতুল্য)


26

আমি একটি লিনাক্স বাক্সে রিবুটের পরে চালানোর জন্য একটি কমান্ড নির্ধারণ করতে চাই। আমি জানি কীভাবে এটি করতে পারি তাই ক্রমান্টব এন্ট্রি সহ প্রতিটি পুনরায় বুট করার পরে কমান্ডটি ধারাবাহিকভাবে চলতে থাকে@reboot তবে আমি কেবল কমান্ডটি একবার চালাতে চাই। এটি চলার পরে, এটি চালানোর জন্য কমান্ডের সারি থেকে সরানো উচিত। আমি মূলত উইন্ডোজ জগতের রানঅনসের সমতুল্য একটি লিনাক্সের সন্ধান করছি ।

ক্ষেত্রে এটি গুরুত্বপূর্ণ:

$ uname -a
Linux devbox 2.6.27.19-5-default #1 SMP 2009-02-28 04:40:21 +0100 x86_64 x86_64 x86_64 GNU/Linux
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ cat /etc/SuSE-release
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 0

এটি করার কোনও সহজ, লিপিযোগ্য উপায় কী?


1
রানওেন্স উইন্ডোজের একটি নিদর্শন যা পুনরায় বুট করার আগে কনফিগারেশন সম্পূর্ণ করতে সমস্যা থেকে আসে। রিবুট করার আগে আপনি কোনও স্ক্রিপ্ট চালাতে না পারার কোনও কারণ আছে? উপরের সমাধানটি রানঅনসের যুক্তিসঙ্গত ক্লোন বলে মনে হচ্ছে।
বিলথোর

উত্তর:


38

@rebootডাকা স্ক্রিপ্ট চালানোর জন্য আপনার ক্রোনটবে একটি এন্ট্রি তৈরি করুন /usr/local/bin/runonce

/etc/local/runonce.d/ranব্যবহার করে ডাইরেক্টরি স্ট্রাকচার তৈরি করুন mkdir -p

স্ক্রিপ্টটি /usr/local/bin/runonceনিম্নরূপ তৈরি করুন :

#!/bin/sh
for file in /etc/local/runonce.d/*
do
    if [ ! -f "$file" ]
    then
        continue
    fi
    "$file"
    mv "$file" "/etc/local/runonce.d/ran/$file.$(date +%Y%m%dT%H%M%S)"
    logger -t runonce -p local3.info "$file"
done

এখন কোনো স্ক্রিপ্ট পরবর্তী রিবুটের (একবার শুধুমাত্র) ডিরেক্টরির মধ্যে চালান চান সেখানে /etc/local/runonce.dএবং chownএবং chmod +xউপযুক্তভাবে করুন। এটি চালানোর পরে, আপনি এটি ranউপ - ডিরেক্টরিতে স্থানান্তরিত করতে এবং তার নামের সাথে সংযুক্ত তারিখ এবং সময়টিতে দেখতে পাবেন। আপনার এন্ট্রিও থাকবে syslog


2
আপনার উত্তরের জন্য ধন্যবাদ. এই সমাধানটি দুর্দান্ত। এটি প্রযুক্তিগতভাবে আমার সমস্যা সমাধান করে, তবে মনে হয় এই কাজটি করার জন্য অনেকগুলি অবকাঠামোগত প্রস্তুতি প্রয়োজন। এটি বহনযোগ্য নয়। আমি মনে করি আপনার সমাধানটি আদর্শভাবে একটি লিনাক্স বিতরণে বেক করা হবে (কেন তা নয় তা আমি নিশ্চিত নই!)। আপনার উত্তরটি আমার চূড়ান্ত সমাধানকে অনুপ্রাণিত করেছিল, যা আমি উত্তর হিসাবে পোস্ট করেছি। আবার ধন্যবাদ!
ক্রিস্টোফার পার্কার

0 থেকে 7 এর মধ্যে অন্য যে কোনও সুবিধাদির তুলনায় আপনি স্থানীয় 3 কী পছন্দ করেছেন?
ক্রিস্টোফার পার্কার

3
@ ক্রিস্টোফার: একটি ডাইস রোল সর্বদা সেরা পদ্ধতি। গুরুতরভাবে, যদিও, উদাহরণস্বরূপ এটি কোনও বিষয় নয় এবং এটিই আমার আঙুলটি চাবিটি land তদুপরি, আমি কোনও আট-পক্ষী মরণের মালিক নই।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস: বুঝেছি, ধন্যবাদ কাকতালীয়ভাবে, লোকাল 3 হ'ল স্থানীয় সুবিধা man logger
ক্রিস্টোফার পার্কার

না $fileপরিবর্তনশীল সম্পূর্ণ পাথ বা শুধু ফাইলের নাম থাকে?
অ্যান্ড্রু সাভিনিখ

21

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

  • আমি শেষ পর্যন্ত অনুভব করেছি যে এটি সেট আপ করতে অনেকগুলি পদক্ষেপ প্রয়োজন।
  • এটির রুট অ্যাক্সেস প্রয়োজন।

আমি মনে করি যে লিনাক্স বিতরণের বাইরের বৈশিষ্ট্য হিসাবে তাঁর সমাধানটি দুর্দান্ত হবে।

বলা হচ্ছে, ডেনিসের সমাধান হিসাবে কম-বেশি একই জিনিস সম্পাদন করার জন্য আমি আমার নিজস্ব স্ক্রিপ্ট লিখেছিলাম। এটির জন্য কোনও অতিরিক্ত সেটআপ পদক্ষেপের প্রয়োজন হয় না এবং এটিতে রুট অ্যাক্সেসের প্রয়োজন হয় না।

#!/bin/bash

if [[ $# -eq 0 ]]; then
    echo "Schedules a command to be run after the next reboot."
    echo "Usage: $(basename $0) <command>"
    echo "       $(basename $0) -p <path> <command>"
    echo "       $(basename $0) -r <command>"
else
    REMOVE=0
    COMMAND=${!#}
    SCRIPTPATH=$PATH

    while getopts ":r:p:" optionName; do
        case "$optionName" in
            r) REMOVE=1; COMMAND=$OPTARG;;
            p) SCRIPTPATH=$OPTARG;;
        esac
    done

    SCRIPT="${HOME}/.$(basename $0)_$(echo $COMMAND | sed 's/[^a-zA-Z0-9_]/_/g')"

    if [[ ! -f $SCRIPT ]]; then
        echo "PATH=$SCRIPTPATH" >> $SCRIPT
        echo "cd $(pwd)"        >> $SCRIPT
        echo "logger -t $(basename $0) -p local3.info \"COMMAND=$COMMAND ; USER=\$(whoami) ($(logname)) ; PWD=$(pwd) ; PATH=\$PATH\"" >> $SCRIPT
        echo "$COMMAND | logger -t $(basename $0) -p local3.info" >> $SCRIPT
        echo "$0 -r \"$(echo $COMMAND | sed 's/\"/\\\"/g')\""     >> $SCRIPT
        chmod +x $SCRIPT
    fi

    CRONTAB="${HOME}/.$(basename $0)_temp_crontab_$RANDOM"
    ENTRY="@reboot $SCRIPT"

    echo "$(crontab -l 2>/dev/null)" | grep -v "$ENTRY" | grep -v "^# DO NOT EDIT THIS FILE - edit the master and reinstall.$" | grep -v "^# ([^ ]* installed on [^)]*)$" | grep -v "^# (Cron version [^$]*\$[^$]*\$)$" > $CRONTAB

    if [[ $REMOVE -eq 0 ]]; then
        echo "$ENTRY" >> $CRONTAB
    fi

    crontab $CRONTAB
    rm $CRONTAB

    if [[ $REMOVE -ne 0 ]]; then
        rm $SCRIPT
    fi
fi

এই স্ক্রিপ্টটি সংরক্ষণ করুন (যেমন runonce:) chmod +x, এবং চালান:

$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"

টাইপোর ক্ষেত্রে, আপনি -r ফ্ল্যাগ সহ রুনস সারি থেকে একটি কমান্ড সরাতে পারেন:

$ runonce fop
$ runonce -r fop
$ runonce foo

সুডো ব্যবহার করে আপনি যেভাবে এটি কাজ করবেন আশা করেন works পরবর্তী পুনরায় বুট করার পরে একবার সার্ভার শুরু করার জন্য দরকারী।

myuser@myhost:/home/myuser$ sudo runonce foo
myuser@myhost:/home/myuser$ sudo crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/root/.runonce_temp_crontab_10478 installed on Wed Jun  9 16:56:00 2010)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
@reboot /root/.runonce_foo
myuser@myhost:/home/myuser$ sudo cat /root/.runonce_foo
PATH=/usr/sbin:/bin:/usr/bin:/sbin
cd /home/myuser
foo
/home/myuser/bin/runonce -r "foo"

কিছু নোট:

  • এই স্ক্রিপ্টটি পরিবেশিত (PATH, কর্মনির্দেশক ডিরেক্টরি, ব্যবহারকারী) এর প্রতিলিপি তৈরি করেছে it
  • এটি মূলত একটি কমান্ড কার্যকর করা স্থগিত করার জন্য ডিজাইন করা হয়েছে কারণ এটি পরবর্তী বুট ক্রমের পরে "এখনই এই মুহূর্তে" কার্যকর করা হবে।

আপনার স্ক্রিপ্টটি সত্যিই দুর্দান্ত দেখাচ্ছে looks একটি বিষয় লক্ষ্যণীয় তা হ'ল এটি ধ্বংসাত্মকভাবে মন্তব্যগুলি ক্রন্টাবের বাইরে ফেলে দেয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস: ধন্যবাদ আমার কাছে সেখানে অতিরিক্ত গ্রিপ কলটি ছিল না, তবে সমস্ত মন্তব্যই পাইল ছিল; তিনবার প্রতিবারের জন্য আমি স্ক্রিপ্ট চালাতাম। আমি মনে করি আমি স্ক্রিপ্টটি পরিবর্তন করে সবসময় কমেন্টের লাইনগুলি সরিয়ে ফেলব যা এই তিনটি স্বয়ংক্রিয় উত্পাদিত মন্তব্যের মতো দেখায়।
ক্রিস্টোফার পার্কার

@ ডেনিস: সম্পন্ন হয়েছে। নিদর্শনগুলি সম্ভবত আরও ভাল হতে পারে তবে এটি আমার পক্ষে কার্যকর।
ক্রিস্টোফার পার্কার

@ ডেনিস: আসলে, crontab.c এর উপর ভিত্তি করে আমার ধারণা আমার প্যাটার্নগুলি ঠিক আছে। ("এই ফাইলটি সম্পাদনা করবেন না" অনুসন্ধান করুন opensource.apple.com/source/cron/cron-35/crontab/crontab.c এ। )
ক্রিস্টোফার পার্কার

5

যেমন তৈরি করুন /root/runonce.sh:

#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local

এতে যুক্ত করুন /etc/rc.local:

/root/runonce.sh

এটি খাঁটি প্রতিভা। Chmod + x /root/runonce.sh করতে ভুলবেন না। এটি আযুর মেশিনগুলিতে আপ্ট-গিগ আপগ্রেডের জন্য উপযুক্ত যা ওয়ালিনাক্সেজেন্ট ডিপি কেজি ব্লক করে
CarComp

এটি খুব হ্যাকি (যদিও এটি প্রথমে আমি কী নিয়ে এসেছি)।
iBug

2

একটি এস 99 দিয়ে স্ক্রিপ্টটি /etc/rc5.d এ সেট আপ করুন এবং এটি চালানোর পরে নিজেই মুছুন।


2

আপনার সাথে এটা করতে পারেন atযদিও আমি লক্ষ্য কমান্ড তুমি পারবে না ব্যবহার (RHEL 5, যা আমি উপর পরীক্ষা উপর অন্তত) at @rebootবা at reboot, কিন্তু আপনি ব্যবহার করতে পারেন at now + 2 minutesএবং তারপর shutdown -r now

এর জন্য আপনার সিস্টেমটি চালাতে 2 মিনিটের বেশি সময় লাগে না।

আপনি যেখানে 0 সেট আপ চান সেখানে এটি দরকারী হতে পারে, যদিও আমি বরং 'রানওনস' কমান্ডটি স্ট্যান্ডার্ড কিট চাইতাম।


সাবধান! আপনার সিস্টেমটি যদি atdবন্ধ না হওয়া পর্যন্ত 2 মিনিটের বেশি সময় নেয় তবে আপনার কমান্ড শাটডাউন চলাকালীন চলতে পারে। atdকমান্ডটি চালিয়ে যাওয়ার আগে atd nowএবং পুনরায় বুট করার আগে এটি বন্ধ করে এড়ানো যেতে পারে ।
mleu

2

আমি মনে করি এই উত্তরটি সবচেয়ে মার্জিত:

স্ক্রিপ্টটি এতে রাখুন /etc/init.d/scriptএবং শেষ লাইনের সাথে স্ব-মুছুন:rm $0

স্ক্রিপ্টটি যদি 100% ব্যর্থ-প্রমাণ না হয় তবে মারাত্মক ত্রুটিযুক্ত লুপ এড়াতে ব্যতিক্রমগুলি পরিচালনা করা সম্ভবত বুদ্ধিমান ..


2

আমি ব্যবহৃত chkconfigস্বয়ংক্রিয়ভাবে একবার বুট পরে এবং কখনও একটি স্ক্রিপ্ট চালাতে আমার সিস্টেম আছে। যদি আপনার সিস্টেমে ckconfig (ফেডোরা, রেডহ্যাট, সেন্টোস, ইত্যাদি) ব্যবহার করে তবে এটি কাজ করবে।

প্রথমে লিপি:

#!/bin/bash
# chkconfig: 345 99 10
# description: This script is designed to run once and then never again.
#


##
# Beginning of your custom one-time commands
#

plymouth-set-default-theme charge -R
dracut -f

#
# End of your custom one-time commands
##


##
# This script will run once
# If you would like to run it again.  run 'chkconfig run-once on' then reboot.
#
chkconfig run-once off
chkconfig --del run-once
  1. স্ক্রিপ্টটির নাম দিন run-once
  2. স্ক্রিপ্টটি এতে রাখুন /etc/init.d/
  3. স্ক্রিপ্ট সক্ষম করুন chkconfig run-once on
  4. পুনরায় বুট করার

সিস্টেম বুট হয়ে গেলে আপনার স্ক্রিপ্ট একবারে আর কখনও চলবে না।

এটি, আপনি চান না না হলে আর কখনও না। আপনি সর্বদা chkconfig run-once onকমান্ডটি দিয়ে স্ক্রিপ্টটি পুনরায় সক্ষম করতে পারবেন ।

আমি এই সমাধানটি পছন্দ করি কারণ এটি সিস্টেমে একটি এবং একটি ফাইল রাখে এবং কারণ প্রয়োজনে রান-ওয়াস কমান্ড পুনরায় জারি করা যেতে পারে।


-1

রেডহাট এবং ডেবিয়ান সিস্টেমে আপনি /etc/rc.local থেকে এটি করতে পারেন, এটি এক ধরণের অটোেক্সেক.বাট।


7
এটি কেবল প্রতিটি পরবর্তী বুটকেই কার্যকর করা যাচ্ছে না।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

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