¿Cómo ejecutar un script de shell en el inicio?

13

He creado un script para iniciar un servidor (mi primera pregunta). Ahora quiero que se ejecute en el arranque del sistema e inicie el servidor definido. ¿Qué debo hacer para hacer esto?

Mis hallazgos me dicen que coloque este archivo en la /etc/init.dubicación y se ejecutará cuando se inicie el sistema. ¿Pero no puedo entender cómo será el primer argumento sobre el inicio start? ¿Está esto predefinido en algún lugar para usar startcomo $1? Si quiero tener un caso startallque inicie todos los servidores en el script, ¿cuáles son las opciones que puedo administrar?

Mi guión es así:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
fuente
Sé que esto es viejo ... pero el shell debería ser '#! / Bin / sh' no '#! / Bin / bash' / bin / sh es más probable que funcione en el caso de una máquina que tiene problemas durante el inicio (por ejemplo, / usr / lib no se puede montar)
Rich Homolka

Respuestas:

19

/etc/init.des el directorio de script, en el que aparecen los scripts ejecutables. Sin embargo, para ejecutar secuencias de comandos en un orden particular después de que se inicie su sistema, debe agregar archivos al /etc/rc#.ddirectorio. Las entradas que aparecen aquí le indican a su sistema en qué orden y en qué nivel de ejecución /etc/init.ddeben ejecutarse los scripts . El número después del rc indica en qué nivel de ejecución está funcionando la máquina, de acuerdo con este gráfico:

http://en.wikipedia.org/wiki/Runlevel

Entonces si tienes:

/etc/init.d/importantscript

Entonces necesitas los archivos (vacíos):

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

La S significa comenzar, y la K significa matar. Cuando su máquina se inicia, el sistema dirá "Ah, estoy ejecutando en RunLevel 3, pasemos a rc3.d para ver qué scripts en '/etc/init.d' necesitan ejecutarse y en qué orden". En este caso, el sistema ordenará por 'S' y luego el número después de 'S' y ejecutará '/etc/init.d/importantscript start'. El 20 es solo para fines de pedido ... su script se ejecutará detrás de 'S19' y delante de 'S21'. Puede crear estos archivos simplemente haciendo:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Aquí también hay un buen resumen: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

aronchick
fuente
¿No es más común "ln -s /etc/init.d/script" a rcX.d / *?
ozma
8

No tiene que --- y no debería --- crear archivos en /etc/rc.d/rcN.d/; lo que debes hacer es poner un comentario en la lectura de tu script de inicio

# chkconfig NNN A B

donde NNNes el conjunto de los niveles de ejecución en el que se desea que el script activo (por ejemplo, 345si es activo en los niveles de ejecución 3, 4y 5), y Ay Bson las prioridades de inicio y parada. Luego chkconfig --add foo(suponiendo que su script tenga nombre foo) creará los archivos /etc/rc.d/rcN.d/con los nombres apropiados.

A continuación, puede utilizar service foo barpara enviar el barmensaje a la secuencia de comandos (por ejemplo, start, stop, lo que sea - que es donde el $1viene).

Peter
fuente
0

El $ 1 es el argumento de la línea de comando que se pasa a su script, es uno de inicio, detención o reinicio. En openSUSE , no recuerdo tener una opción para pasar otros argumentos al script al usar el editor de nivel de ejecución, así que creo que estos son probablemente los únicos que debería usar.

Yo no uso CentOS , pero parece que el programa controla lo que se inicia en qué nivel de ejecución es ntsysv .

Neal
fuente