GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:programe el comando para que se ejecute una vez después de reiniciar (equivalente a RunOnce)

Solución 1:

Crea un @reboot entrada en su crontab para ejecutar un script llamado /usr/local/bin/runonce .

Cree una estructura de directorio llamada /etc/local/runonce.d/ran usando mkdir -p .

Crea el guión /usr/local/bin/runonce de la siguiente manera:

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

Ahora coloque cualquier script que desee ejecutar en el próximo reinicio (solo una vez) en el directorio /etc/local/runonce.d y chown y chmod +x apropiadamente. Una vez que se haya ejecutado, encontrará que se movió al ran subdirectorio y la fecha y la hora adjuntas a su nombre. También habrá una entrada en su syslog .

Solución 2:

Realmente aprecio el esfuerzo puesto en la respuesta de Dennis Williamson. Sin embargo, quería aceptarlo como la respuesta a esta pregunta, ya que es elegante y simple:

  • Al final, sentí que la configuración requería demasiados pasos.
  • Requiere acceso de root.

Creo que su solución sería excelente como una característica lista para usar de una distribución de Linux.

Dicho esto, escribí mi propio guión para lograr más o menos lo mismo que la solución de Dennis. No requiere ningún paso de configuración adicional y no requiere acceso de 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

Guarde este script (por ejemplo:runonce ), chmod +x y ejecuta:

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

En caso de error tipográfico, puede eliminar un comando de la cola runonce con el indicador -r:

$ runonce fop
$ runonce -r fop
$ runonce foo

El uso de sudo funciona de la manera que esperarías que funcionara. Útil para iniciar un servidor solo una vez después del próximo reinicio.

[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"

Algunas notas:

  • Este script replica el entorno (RUTA, directorio de trabajo, usuario) en el que se invocó.
  • Está diseñado para diferir básicamente la ejecución de un comando, ya que se ejecutaría "aquí mismo, ahora mismo" hasta después de la siguiente secuencia de arranque.

Solución 3:

Crear, p. /root/runonce.sh :

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

Añadir a /etc/rc.local :

/root/runonce.sh

Solución 4:

Usé chkconfig para que mi sistema ejecute automáticamente un script una vez después del arranque y nunca más. Si su sistema usa ckconfig (Fedora, RedHat, CentOs, etc.) esto funcionará.

Primero el guión:

#!/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. Nombre la secuencia de comandos run-once
  2. Coloca el guión en /etc/init.d/
  3. Habilite el script chkconfig run-once on
  4. reiniciar

Cuando el sistema arranque, su secuencia de comandos se ejecutará una vez y nunca más.

Es decir, nunca más a menos que tú lo desees. Siempre puede volver a habilitar el script con el chkconfig run-once on comando.

Me gusta esta solución porque pone uno y solo un archivo en el sistema y porque el comando ejecutar una vez se puede volver a emitir si es necesario.

Solución 5:

Configure el script en /etc/rc5.d con un S99 y haga que se elimine solo después de ejecutarse.


Linux
  1. Cómo reiniciar Linux usando la línea de comandos

  2. Comando de reinicio de Linux

  3. Comando de eco de Linux

  4. Ejemplos de comandos echo en Linux

  5. ¿Cómo programo un reinicio en Linux?

Comando de eco en Linux

Cómo ejecutar varios comandos de Linux a la vez en la terminal de Linux

El comando Nohup en Linux le permite ejecutar comandos incluso después de cerrar sesión

Comando echo en Linux:7 ejemplos prácticos

Programar trabajos en Linux con el comando 'at'

Ejemplos de comandos echo de Linux