¿Cómo iniciar un servicio automáticamente cuando se inicia Ubuntu?

31

Estoy usando Ubuntu 12.04 y quiero que se inicie un servicio cuando el sistema se inicia normalmente.

Como 'servicio' entiendo algo de código, por ejemplo cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x que debería ejecutarse como si se hubiera iniciado en la línea de comandos. Hay servicios que se iniciarán como usuario normal, pero también servicios que se iniciarán como root (de hecho, no es necesario que los servicios se ejecuten a nivel de usuario).

También necesito configurar el comportamiento cuando se detiene un 'servicio'. Quiero que se reinicien en mi caso, con el mismo argumento, en un directorio especificado.

Todos los servicios deben iniciarse automáticamente cuando el sistema se inicia normalmente, es decir, si se presiona el interruptor de encendido. No se requiere ninguna otra acción.

Hay algunos documentos difundidos en Internet, pero todos me confunden. Se habla de init, init.d, rc.d, pero nunca vieron una instrucción sencilla de seguir el paso a paso para fácilmente como un servicio utilizando por ejemplo advenedizo. Si esto es fácil, agradecería que se den esos pasos aquí.

Alex
fuente

Respuestas:

33

Para crear un trabajo que se iniciará automáticamente cuando se inicie Ubuntu, use el ejemplo que se proporciona aquí . Como ejemplo escrito, suponga crear el siguiente archivo /etc/init/testservice.confcon sudo:

# testservice - test service job file

description "my service description"
author "Me <[email protected]>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

Para iniciar o detener el proceso de forma manual, use

sudo start testservice
sudo stop testservice

Ver los comandos de control de trabajo .

Alex
fuente
Necesitaba "iniciar en el montaje iniciado" para iniciar el servicio.
Martinedwards
23

Ok, Alex, el punto es que todos los procesos del espacio de usuario en Linux se inician con el initproceso, cuyo pid es 1. Por ejemplo, ejecuta pstreepara ver el árbol de tus procesos, cuya raíz es init. Actualmente hay varias versiones de initimplementación de procesos. , los más notables son

  • sysVinit (init clásico, todavía utilizado por algunas distribuciones, incluyendo Debian anterior)
  • Upstart init, utilizado por Ubuntu anterior y algunas versiones de RHEL (Red Hat) y Fedora anteriores
  • systemd init, utilizado por las versiones modernas de Fedora, Ubuntu, Debian, RHEL, SUSE

Tradicionalmente, Unix usaba la implementación init llamada sysVinitinit, llamada por el nombre de https://ru.wikipedia.org/wiki/UNIX_System_V versión de Unix. Es muy influyente y otros inits son compatibles con versiones anteriores.

Básicamente, sysVinit primero lee el /etc/inittabarchivo, decide qué nivel de ejecución ejecutar y le dice al /etc/init.d/rcscript que ejecute los llamados scripts de inicio. Por ejemplo, cuando normalmente arranca en un nivel de ejecución multiusuario, que generalmente es el nivel de ejecución 2 en Ubuntu , /etc/init.d/rccomienza a ejecutar scripts en /etc/rc2.d. Los archivos solo tienen enlaces simbólicos a los scripts, mientras que los scripts se almacenan en el /etc/init.ddirectorio. Los nombres de esos enlaces simbólicos en los /etc/rc*.ddirectorios son los siguientes. Digamos que tenemos los siguientes scripts en /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

Significa que, al cambiar al proceso init de nivel de ejecución 2, primero se matan los network-managerprocesos, porque su nombre de script comienza con K, K02network-managery luego comienza los procesos, cuyos nombres comienzan con S. Los dos dígitos después So Kes el número de 00 a 99, que determina el orden en el que se inician los procesos. Por ejemplo, rsyslogse inicia antes apache2, porque 16 es menor que 17 (eso tiene sentido, porque desea que apache confíe en las capacidades de registro de rsyslog , por lo tanto, rsyslog debe iniciarse primero). Los guiones son guiones casuales, ejecutados por #!/bin/sh.

Entonces, básicamente para iniciar un programa al iniciar en estilo sysVinit, escriba su propio script (copie y pegue desde cualquier ejemplo que haya ingresado /etc/init.d), póngalo /etc/init.dy cree un enlace simbólico con un nombre razonable, por ejemplo, S99mytrojanen /etc/rc2.d. Aquí hay una explicación de los scripts típicos de sysVinit en /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

Ahora, los chicos de Ubuntu decidieron que querían una funcionalidad adicional de init. Querían un sistema operativo de arranque rápido, por lo que querían que sus scripts se ejecutaran en paralelo; querían que los procesos muertos se reiniciaran automáticamente; querían que los procesos se invoquen entre sí de manera explícita por eventos (para que apache se ejecute por evento "syslog inició", y syslog se ejecuta por evento "sistema de archivos montado", etc., por lo que tenemos eventos en lugar de algunos números 00 -99). De este modo, han hecho Upstart y aquí es cómo funciona. Los initscripts iniciales se colocan en el /etc/initdirectorio (no confundir con /etc/init.d). Upstart generalmente /etc/init.d/rctambién se ejecuta , por lo que ejecutará sus sysVinit scripts normalmente. Pero si desea que su script sea reaparecido al salir, los eventos de Upstart son para usted.

Aunque no puedo verificar que mi script esté funcionando, supongo que, para sus objetivos, debe escribir el siguiente /etc/init/mytrojan.confscript:

start on runlevel [02]
respawn
exec mytrojan --argument X 

Pero si necesita dependencias, al menos sistemas de archivos y red, puede tener sentido reemplazar start on runlevel [02]con algo como:

start on (local-filesystems and net-device-up IFACE!=lo)

ADVERTENCIA: No verifiqué la corrección de esto, porque no puedo. Especialmente, no estoy muy seguro de cómo iniciar el script después de que su conexión de red esté funcionando (utilicé esta versión ). Intenta buscar en Google "upstart on network up".

Boris Burkov
fuente
1
Este es un resumen muy bueno sobre la historia del proceso iniciado en Linux, pero no responde con preguntas. Todavía no sé cómo "crear" un proceso inicial. También solo quiero usarlo, no entender ni un poquito cómo funciona. Solo quería tener un ejemplo de trabajo simple y fácil de usar, sobre cómo crear un proceso para comenzar y reaparecer automáticamente con el arranque de ubuntu ... l.
Alex
@Alex: actualizado con una muestra de scipt. Tenga en cuenta que mi script podría estar equivocado. Lo hice en espíritu de alexreisner.com/code/upstart .
Boris Burkov
1
Votado porque esta es una de las mejores respuestas que he leído.
user1301428