Linux: Pianificare il command per eseguire una volta dopo il riavvio (equivalente di RunOnce)

Vorrei programmare un command da eseguire dopo il riavvio in una casella Linux. So come farlo in modo che il command @reboot dopo each riavvio con una voce @reboot crontab, ma voglio solo che il command venga eseguito una sola volta. Dopo l'esecuzione, dovrebbe essere rimosso dalla coda di comandi da eseguire. Sto cercando essenzialmente un Linux equivalente a RunOnce nel mondo di Windows.

Se è importnte:

  • Impostazione del fuso orario con uno script automatico
  • Convertire la directory sull'image del disco virtuale QEMU / KVM
  • Quanto è rotta la strategia di routing che causa un pacchetto marziano (finora solo) durante il tracepath?
  • Rendere le cartelle su più unità appaiono in una singola cartella senza utilizzare i collegamenti simbolici
  • Perché (o come) il numero di descrittori di file aperti in uso da root supera ulimit -n?
  • Quale manutenzione annuale o trimestrale fai sui tuoi server Linux?
  •  $ uname -a Linux devbox 2.6.27.19-5-default #1 SMP 2009-02-28 04:40:21 +0100 x86_64 x86_64 x86_64 GNU/Linux $ bash --version GNU bash, version 3.2.48(1)-release (x86_64-suse-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. $ cat /etc/SuSE-release SUSE Linux Enterprise Server 11 (x86_64) VERSION = 11 PATCHLEVEL = 0 

    C'è un modo facile e scriptable per farlo?

  • Linux per controllare i record TXT di un dominio
  • Rendere disponibili i moduli del kernel che sono stati distriggersti ​​su Fedora
  • Come eseguire automaticamente uno script quando il contenuto di una directory cambia in Linux?
  • Come submit il command "ATA Secure Erase" a SSD?
  • Determinare i file che un process ha aperto (Linux)
  • Come posso trovare tutti i file e le directory scrivibili da un utente specifico?
  • 8 Solutions collect form web for “Linux: Pianificare il command per eseguire una volta dopo il riavvio (equivalente di RunOnce)”

    Creare una voce @reboot nella crontab per eseguire uno script denominato /usr/local/bin/runonce .

    Creare una struttura di directory denominata /etc/local/runonce.d/ran utilizzando mkdir -p .

    Creare script /usr/local/bin/runonce come segue:

     #!/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 

    Ora posiziona qualsiasi script che si desidera eseguire al successivo riavvio (una sola volta) nella directory /etc/local/runonce.d e chown e chmod +x appropriatamente. Una volta eseguito, lo troverai spostato nella sottodirectory ran e la data e l'ora aggiunti al suo nome. Ci sarà anche una voce nel tuo syslog .

    Apprezzo veramente lo sforzo messo in risposta alla risposta di Dennis Williamson . Volevo accettarlo come risposta a questa domanda, in quanto è elegante e semplice:

    • Alla fine ho sentito che richiedeva troppi passi per impostare.
    • Richiede l'accesso alla radice.

    Penso che la sua soluzione sarebbe stata grande come una caratteristica fuori dal box di una distribuzione Linux.

    Detto questo, ho scritto il mio script per realizzare più o less la stessa cosa della soluzione di Dennis. Non richiede ulteriori passi di installazione e non richiede l'accesso di 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 

    Salvare questo script (ad esempio: runonce ), chmod +x e eseguire:

     $ runonce foo $ runonce "echo \"I'm up. I swear I'll never email you again.\" | mail -s \"Server's Up\" $(whoami)" 

    In caso di errore, è ansible rimuovere un command dalla coda di runonce con il flag -r:

     $ runonce fop $ runonce -r fop $ runonce foo 

    L'utilizzo del sudo funziona come si prevede di funzionare. Utile per avviare un server una sola volta dopo il riavvio successivo.

     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" 

    Alcune note:

    • Questo script replica l'ambiente (PATH, directory di lavoro, utente) in cui è stato richiamato.
    • È stato progettato per deferire l'esecuzione di un command come sarebbe stato eseguito "proprio qui, adesso" fino alla successiva sequenza di avvio.

    Impostare lo script in /etc/rc5.d con un S99 e eliminarlo dopo l'esecuzione.

    Potete farlo con il command at , anche se noto che non puoi (alless su RHEL 5, che ho testato su) utilizzare at @reboot o at reboot , ma puoi utilizzare at now + 2 minutes e poi shutdown -r now .

    Ciò non richiede che il sistema richiede più di 2 minuti per eseguire.

    Potrebbe essere utile where si desidera impostare 0, anche se preferisco che il command "runonce" fosse un kit standard.

    Penso che questa risposta sia la più elegante:

    Inserisci script in /etc/init.d/script e cancella automaticamente con l'ultima row: rm $0

    A less che lo script non sia 100% fail-proof, probabilmente saggio per gestire eccezioni per evitare un ciclo di errore fatale.

    Ho usato chkconfig per avere il mio sistema eseguire automaticamente uno script una volta dopo l'avvio e mai più. Se il sistema utilizza ckconfig (Fedora, RedHat, CentOs, ecc.) Questo functionrà.

    In primo luogo lo script:

     #!/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. Nome dello script run-once
    2. Inserisci lo script in /etc/init.d/
    3. Attiva lo script chkconfig run-once on
    4. riavvio

    Quando il sistema avvia il tuo script verrà eseguito una volta e mai più.

    Cioè, mai più a less che tu lo desideri. Puoi sempre ritriggersre lo script con il command chkconfig run-once on .

    Mi piace questa soluzione perché mette un solo file sul sistema e perché il command run-once può essere rilasciato se necessario.

    Crea eg /root/runonce.sh :

     #!/bin/bash #your command here sed -i '/runonce.sh/d' /etc/rc.local 

    Aggiungi a /etc/rc.local :

     /root/runonce.sh 

    in sisthemes redhat e debian è ansible farlo da /etc/rc.local, è una sorta di autoexec.bat.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.