¿Cómo puedo hacer que un script en /etc/init.d comience en el arranque?

83

Creo que leí algo hace un tiempo sobre esto, pero no recuerdo cómo se hizo. Básicamente, tengo un servicio en el /etc/init.dque me gustaría iniciar automáticamente en el momento del arranque. Recuerdo que tiene algo que ver con vincular el script al /etc/rc.ddirectorio, pero no puedo recordarlo en este momento. ¿Cuál es el comando para esto?

Creo que estoy en un derivado de Fedora / CentOS.

Naftuli Kay
fuente
Eso depende de su sistema operativo. ¿Qué variante de Unix está ejecutando, y si Linux, qué distribución? Entre los cuales /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localy algunos más tiene?
Gilles
1
Creo que estoy en CentOS o algo así. ¿La respuesta sería diferente para Debian? También estoy interesado en una solución para Debian.
Naftuli Kay

Respuestas:

109

Si está en un sistema basado en Red Hat, como mencionó, puede hacer lo siguiente:

  1. Cree un guión y colóquelo en /etc/init.d(por ejemplo /etc/init.d/myscript). El script debe tener el siguiente formato:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

El formato es bastante estándar y puede ver los scripts existentes en /etc/init.d. A continuación, puede usar el script como /etc/init.d/myscript starto chkconfig myscript start. La ckconfigpágina del manual explica el encabezado del script:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

El código de inicio, detención y estado de ejemplo utiliza funciones auxiliares definidas en /etc/init.d/functions

  1. Habilita el script

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Verifique que el script esté habilitado; debería ver "on" para los niveles que seleccionó.

    $ chkconfig --list | grep myscript
    
canen
fuente
3
Chkconfig es lo que quieres. +1
whoami
¿Por qué init inicia algo en los niveles de ejecución 2, 3, 4 y 5? ¿No tiene que tener cuidado para evitar iniciar un servidor en el nivel de ejecución 2? Y el nivel de ejecución 4 no está definido en RHEL de todos modos, entonces, ¿por qué intentar iniciarlo en ese nivel de ejecución? No críticas, solo ganas de saber. Soy un usuario nativo de Slackware.
Bruce Ediger
4 no está definido en RHEL, pero existe. Puedes robarlo por tus propias cosas.
Kevin M
El encabezado se toma de la página de manual de chkconfig. Personalmente me quedo con 235 o solo 35 en la mayoría de los casos.
canen
¿Hay algún registro que pueda ver si algo no se inicia durante el inicio?
Utkarsh Sinha
10

Usted prueba, en qué nivel de ejecución normalmente comienza su máquina.

runlevel

A menudo esto es 5 o 2, hay varias convenciones, pero nada realmente establecido, afaik. Ubuntu usa 2, mientras que la distribución anterior que usaba siempre usaba

  • 1 usuario individual (superusuario)
  • 2 multiusuario
  • 3 multiusuario + red
  • 4 no utilizado / definible por el usuario
  • 5 multiusuario, red + X11

Luego haces un enlace simbólico desde tu script de inicio, tal vez /etc/init.d/foobarpara/etc/rc2.d/SXYfoobar

S significa 'Iniciar este script en este nivel de ejecución (aquí: 2). XY es un número decimal de dos dígitos, que es relevante para la secuencia, se inician los scripts.

Si depende de que el script S45barfoo se ejecute antes que usted, y S55foofoo depende de su script, elegiría xy entre 45 y 55. Para números iguales, el orden de arranque no está definido.

Mientras tanto, Ubuntu cambió (está cambiando) a otro procedimiento de inicio, llamado upstart.

Y tenga en cuenta: no siempre los enlaces enlazan a /etc/rcX.dveces, es /etc/init/rcX.dalgo similar, pero debería ser fácil de encontrar, en algún lugar debajo de / etc.

Si desea iniciar algo al final de los scripts de inicio, /etc/rc.localsería un archivo para buscar, pero si depende de que X11 ya se esté ejecutando, puede buscar una opción de inicio automático de su entorno de escritorio, o /etc/X11/Xsession.d/con un patrón similar al descrito encima.

Si depende de que la red esté activa, hay un directorio separado (if-up.d) y para dispositivos montados como unidades USB externas /etc/udev/rules.d/.

usuario desconocido
fuente
¿No hay un comando que haga el enlace simbólico por ti? Pensé que recordaba algo así.
Naftuli Kay
1
¿No fue así update-rc.d?
Naftuli Kay
GUI o línea de comando? Su DE podría proporcionar una herramienta para marcar los niveles de ejecución, dónde comenzar o detener su script. He visto algo así, pero no recuerdo un nombre y cómo especificar el número (xy).
Usuario desconocido el
Línea de comando. Maneja los enlaces simbólicos por usted y le permite activar los interruptores en función de si ciertas secuencias de comandos se ejecutan o no.
Naftuli Kay
3

Como Naftuli Tzvi Kay preguntó sobre Debian arriba: a partir de Debian 6, su script debe contener un encabezado LSB (Base de estándares de Linux) que indique sus dependencias y capacidades ( consulte la página wiki de Debian ).

Si hay un encabezado LSB, puede usarlo insservpara incluir su script en el proceso de arranque ( vea otra página wiki de Debian ).

mdt
fuente