Řešení 1:
Vytvořte @reboot
záznam ve vašem crontab ke spuštění skriptu s názvem /usr/local/bin/runonce
.
Vytvořte adresářovou strukturu nazvanou /etc/local/runonce.d/ran
pomocí mkdir -p
.
Vytvořte skript /usr/local/bin/runonce
takto:
#!/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
Nyní umístěte libovolný skript, který chcete spustit při příštím restartu (pouze jednou), do adresáře /etc/local/runonce.d
a chown
a chmod +x
to přiměřeně. Jakmile bude spuštěn, zjistíte, že byl přesunut do ran
podadresář a datum a čas připojený k jeho názvu. Bude zde také položka ve vašem syslog
.
Řešení 2:
Opravdu oceňuji úsilí vložené do odpovědi Dennise Williamsona. Chtěl jsem to přijmout jako odpověď na tuto otázku, protože je elegantní a jednoduchý:
- Nakonec jsem cítil, že nastavení vyžaduje příliš mnoho kroků.
- Vyžaduje přístup root.
Myslím, že jeho řešení by bylo skvělé jako hotová funkce linuxové distribuce.
Jak již bylo řečeno, napsal jsem svůj vlastní scénář, abych dosáhl víceméně stejné věci jako Dennisovo řešení. Nevyžaduje žádné další kroky nastavení a nevyžaduje přístup root.
#!/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
Uložte tento skript (např.:runonce
), chmod +x
a spusťte:
$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"
V případě překlepu můžete odebrat příkaz z fronty runonce pomocí parametru -r:
$ runonce fop
$ runonce -r fop
$ runonce foo
Použití sudo funguje tak, jak byste očekávali, že bude fungovat. Užitečné pro spuštění serveru pouze jednou po příštím restartu.
[email protected]:/home/myuser$ sudo runonce foo
[email protected]:/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
[email protected]:/home/myuser$ sudo cat /root/.runonce_foo
PATH=/usr/sbin:/bin:/usr/bin:/sbin
cd /home/myuser
foo
/home/myuser/bin/runonce -r "foo"
Několik poznámek:
- Tento skript replikuje prostředí (PATH, pracovní adresář, uživatel), ve kterém byl vyvolán.
- Je navržen tak, aby v podstatě odložil provedení příkazu, protože by byl proveden „právě tady, právě teď“ až po další zaváděcí sekvenci.
Řešení 3:
Vytvořte např. /root/runonce.sh
:
#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local
Přidat do /etc/rc.local
:
/root/runonce.sh
Řešení 4:
Použil jsem chkconfig
aby můj systém automaticky spustil skript jednou po spuštění a nikdy znovu. Pokud váš systém používá ckconfig (Fedora, RedHat, CentOs atd.), bude to fungovat.
Nejprve skript:
#!/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
- Pojmenujte skript
run-once
- Umístěte skript do
/etc/init.d/
- Povolte skript
chkconfig run-once on
- restartovat
Když se systém spustí, váš skript se spustí jednou a nikdy znovu.
To znamená, že už nikdy více, pokud to nebudete chtít. Skript můžete kdykoli znovu povolit pomocí chkconfig run-once on
příkaz.
Líbí se mi toto řešení, protože vkládá do systému pouze jeden soubor a protože příkaz run-once lze v případě potřeby znovu zadat.
Řešení 5:
Nastavte skript v /etc/rc5.d s S99 a nechte jej po spuštění smazat.