¿Cómo ejecuto un script 5 minutos después del inicio?

7

Tengo varios sitios web RoR ejecutándose en mi servidor web y necesito ejecutar un script ruby ​​al inicio.

Entonces, puse una secuencia de comandos bash en /etc/init.d que llamó a un proceso ruby. Desafortunadamente, ese proceso de rubí necesita algunas cosas que aún no están cargadas.

Intenté agregar un sleep 300al comienzo de mi script bash, pero realmente no ayuda porque también afecta el inicio de cosas como ssh, apache, etc.

Además, no quiero cargar todas las bibliotecas de ruby ​​al inicio, porque ralentizaría el tiempo de arranque.

boby lapointe
fuente

Respuestas:

10

sleep 300 es el camino a seguir, pero debes ponerlo en una función que llamarás asíncrona:

myscript()
{
    sleep 300

    # do what you want
}

myscript &

# continue with other things
Tamara Wijsman
fuente
6

Dormir durante cinco minutos es un truco bastante inestable. ¿Qué pasa si algo más tarde en la cadena de arranque tarda mucho tiempo en iniciarse? ¿Y por qué quieres que tu sistema tarde más de lo necesario para arrancar?

La forma correcta de hacerlo es hacer que su script de inicio se ejecute después de las cosas de las que depende. Cómo haces esto difiere entre las distribuciones.

En Debian, especifica en el encabezado del script qué dependencias tiene su script: Aquí hay un ejemplo de /etc/init.d/READMEDebian Wheezy:

# Required-Start:    $remote_fs $syslog

En otros sistemas, generalmente se nombra el script con un número en algún lugar del nombre del archivo en una de las /etc/rc?.d/carpetas. En tales distribuciones, solo dale un número más alto que las cosas de las que depende.

Emil Vikström
fuente
¿Por qué sería inestable? El sueño incluso proporciona 5msintaxis. Estoy de acuerdo en que las dependencias son el camino a seguir, aunque las botas que tardan más de cinco minutos probablemente deberían analizarse y el error del script RoR es una buena forma de llamar la atención (pero no la forma correcta).
Tamara Wijsman
1
Es inestable porque generalmente retrasar las operaciones para corregir un error indica un problema de concurrencia y agregar un retraso funcionará hasta que su sistema se vuelva más lento / más rápido.
ASTOR
0

Me pregunto si podrías iniciar otro hilo y lo primero que hace ese hilo es dormir 300. Luego llamaría al script que habrías llamado desde init.d

Creo que sería algo como

newscript &
AeroJoe
fuente
0

crea un archivo: delay

#!/bin/bash
# $1:delay time(s)
# $2:command
# example:
#    delay 10 "conky -d"

sleep $1
exec $2

entonces

chmod a+x delay
delay 10 "xxx"

ponlo adentro /etc/rc.local

Nueve Colinas
fuente