मैं वास्तव में डेनिस विलियमसन के जवाब में डाले गए प्रयास की सराहना करता हूं । मैं इसे इस प्रश्न के उत्तर के रूप में स्वीकार करना चाहता था, क्योंकि यह सुरुचिपूर्ण और सरल है, हालांकि:
- मैंने अंततः महसूस किया कि इसे स्थापित करने के लिए बहुत अधिक कदमों की आवश्यकता है।
- इसे रूट एक्सेस की आवश्यकता है।
मुझे लगता है कि उसका समाधान लिनक्स वितरण के एक आउट-ऑफ-द-बॉक्स सुविधा के रूप में महान होगा।
कहा जा रहा है, मैंने डेनिस के समाधान के रूप में कमोबेश उसी चीज को पूरा करने के लिए अपनी स्क्रिप्ट लिखी। इसके लिए किसी भी अतिरिक्त सेटअप चरणों की आवश्यकता नहीं है और इसे रूट एक्सेस की आवश्यकता नहीं है।
#!/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
सुडो का उपयोग करने से आपके काम करने के तरीके की उम्मीद होती है। अगले रिबूट के बाद एक बार सर्वर शुरू करने के लिए उपयोगी है।
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, वर्किंग डायरेक्टरी, उपयोगकर्ता) की प्रतिकृति बनाती है।
- यह मूल रूप से एक कमांड के निष्पादन को स्थगित करने के लिए डिज़ाइन किया गया है क्योंकि इसे अगले बूट अनुक्रम के बाद "सही यहीं, अभी" निष्पादित किया जाएगा।