GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux:Befehl so planen, dass er einmal nach dem Neustart ausgeführt wird (RunOnce-Äquivalent)

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
  1. Benennen Sie das Skript run-once
  2. Platzieren Sie das Skript in /etc/init.d/
  3. Aktivieren Sie das Skript chkconfig run-once on
  4. 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.


Linux
  1. Linux-Neustartbefehl

  2. Linux-Echo-Befehl

  3. Echo-Befehlsbeispiele in Linux

  4. Linux:Wie man einen Befehl in einem bestimmten Verzeichnis ausführt

  5. Führen Sie den cd-Befehl als Superuser unter Linux aus

Echo-Befehl unter Linux

So führen Sie mehrere Linux-Befehle gleichzeitig im Linux-Terminal aus

Mit dem Nohup-Befehl unter Linux können Sie Befehle auch nach dem Abmelden ausführen

Echo-Befehl unter Linux:7 praktische Beispiele

Planen Sie Jobs in Linux mit dem Befehl 'at'

Beispiele für Linux-Echo-Befehle