GNU/Linux >> Znalost Linux >  >> Linux

Linux:Naplánujte spuštění příkazu jednou po restartu (ekvivalent RunOnce)

Ř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
  1. Pojmenujte skript run-once
  2. Umístěte skript do /etc/init.d/
  3. Povolte skript chkconfig run-once on
  4. 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.


Linux
  1. Příklady příkazů echo v Linuxu

  2. linux:jak spustit příkaz v daném adresáři

  3. Spusťte příkaz cd jako superuživatel v Linuxu

  1. Jak restartovat Linux pomocí příkazového řádku

  2. Příkaz pro restart systému Linux

  3. Jak naplánuji restart na Linuxu?

  1. Echo Command v Linuxu (s příklady)

  2. 16 Příklady příkazů Echo v Linuxu

  3. Linuxový příkaz echo