Lösung 1:
Erstellen Sie einen @reboot
Eintrag in Ihrer Crontab, um ein Skript namens /usr/local/bin/runonce
auszuführen .
Erstellen Sie eine Verzeichnisstruktur namens /etc/local/runonce.d/ran
mit mkdir -p
.
Erstellen Sie das Skript /usr/local/bin/runonce
wie folgt:
#!/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
Legen Sie nun ein beliebiges Skript, das beim nächsten Neustart (einmalig) ausgeführt werden soll, in das Verzeichnis /etc/local/runonce.d
und chown
und chmod +x
es angemessen. Sobald es ausgeführt wurde, finden Sie es in ran
verschoben Unterverzeichnis und das Datum und die Uhrzeit, die an seinen Namen angehängt sind. Es wird auch einen Eintrag in Ihrem syslog
geben .
Lösung 2:
Ich weiß die Mühe sehr zu schätzen, die in Dennis Williamsons Antwort gesteckt wurde. Ich wollte es als Antwort auf diese Frage akzeptieren, da es elegant und einfach ist, aber:
- Letztendlich hatte ich das Gefühl, dass die Einrichtung zu viele Schritte erforderte.
- Es erfordert Root-Zugriff.
Ich denke, seine Lösung wäre großartig als sofort einsatzbereites Feature einer Linux-Distribution.
Abgesehen davon habe ich mein eigenes Skript geschrieben, um mehr oder weniger dasselbe zu erreichen wie Dennis' Lösung. Es erfordert keine zusätzlichen Setup-Schritte und keinen Root-Zugriff.
#!/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
Speichern Sie dieses Skript (z. B.:runonce
), chmod +x
, und führen Sie Folgendes aus:
$ runonce foo
$ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)"
Im Falle eines Tippfehlers können Sie mit dem Flag -r einen Befehl aus der Runonce-Warteschlange entfernen:
$ runonce fop
$ runonce -r fop
$ runonce foo
Die Verwendung von sudo funktioniert so, wie Sie es erwarten würden. Nützlich, um einen Server nur einmal nach dem nächsten Neustart zu starten.
[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"
Einige Anmerkungen:
- Dieses Skript repliziert die Umgebung (PFAD, Arbeitsverzeichnis, Benutzer), in der es aufgerufen wurde.
- Es wurde entwickelt, um die Ausführung eines Befehls so zu verschieben, wie er "genau hier und jetzt" ausgeführt würde, bis nach der nächsten Startsequenz.
Lösung 3:
Erstellen Sie z. /root/runonce.sh
:
#!/bin/bash
#your command here
sed -i '/runonce.sh/d' /etc/rc.local
Zu /etc/rc.local
hinzufügen :
/root/runonce.sh
Lösung 4:
Ich habe chkconfig
verwendet mein System einmal nach dem Booten automatisch ein Skript ausführen zu lassen und nie wieder. Wenn Ihr System ckconfig verwendet (Fedora, RedHat, CentOs usw.), wird dies funktionieren.
Zuerst das 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
- Benennen Sie das Skript
run-once
- Platzieren Sie das Skript in
/etc/init.d/
- Aktivieren Sie das Skript
chkconfig run-once on
- Neustart
Wenn das System hochfährt, wird Ihr Skript einmal und nie wieder ausgeführt.
Das heißt, nie wieder, es sei denn, Sie wollen es. Sie können das Skript jederzeit mit dem chkconfig run-once on
wieder aktivieren Befehl.
Ich mag diese Lösung, weil sie eine und nur eine Datei auf dem System ablegt und weil der Run-Once-Befehl bei Bedarf erneut ausgegeben werden kann.
Lösung 5:
Richten Sie das Skript in /etc/rc5.d mit einem S99 ein und lassen Sie es sich nach dem Ausführen selbst löschen.