ডেনিস উইলিয়ামসনের উত্তরের প্রয়াসকে আমি সত্যই প্রশংসা করি । যদিও এটি মার্জিত এবং সাধারণ, তবে আমি এই প্রশ্নের উত্তর হিসাবে এটি গ্রহণ করতে চেয়েছিলাম:
- আমি শেষ পর্যন্ত অনুভব করেছি যে এটি সেট আপ করতে অনেকগুলি পদক্ষেপ প্রয়োজন।
- এটির রুট অ্যাক্সেস প্রয়োজন।
আমি মনে করি যে লিনাক্স বিতরণের বাইরের বৈশিষ্ট্য হিসাবে তাঁর সমাধানটি দুর্দান্ত হবে।
বলা হচ্ছে, ডেনিসের সমাধান হিসাবে কম-বেশি একই জিনিস সম্পাদন করার জন্য আমি আমার নিজস্ব স্ক্রিপ্ট লিখেছিলাম। এটির জন্য কোনও অতিরিক্ত সেটআপ পদক্ষেপের প্রয়োজন হয় না এবং এটিতে রুট অ্যাক্সেসের প্রয়োজন হয় না।
#!/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
- এটি মূলত একটি কমান্ড কার্যকর করা স্থগিত করার জন্য ডিজাইন করা হয়েছে কারণ এটি পরবর্তী বুট ক্রমের পরে "এখনই এই মুহূর্তে" কার্যকর করা হবে।