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í.
Ok, Alex, el punto es que todos los procesos del espacio de usuario en Linux se inician con el
init
proceso, cuyo pid es 1. Por ejemplo, ejecutapstree
para ver el árbol de tus procesos, cuya raíz es init. Actualmente hay varias versiones deinit
implementación de procesos. , los más notables sonTradicionalmente, Unix usaba la implementación init llamada
sysVinit
init, 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/inittab
archivo, decide qué nivel de ejecución ejecutar y le dice al/etc/init.d/rc
script 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/rc
comienza 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.d
directorio. Los nombres de esos enlaces simbólicos en los/etc/rc*.d
directorios son los siguientes. Digamos que tenemos los siguientes scripts en/etc/rc2.d
:Significa que, al cambiar al proceso init de nivel de ejecución 2, primero se matan los
network-manager
procesos, porque su nombre de script comienza conK
,K02network-manager
y luego comienza los procesos, cuyos nombres comienzan conS
. Los dos dígitos despuésS
oK
es el número de 00 a 99, que determina el orden en el que se inician los procesos. Por ejemplo,rsyslog
se inicia antesapache2
, 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.d
y cree un enlace simbólico con un nombre razonable, por ejemplo,S99mytrojan
en/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.htmlAhora, 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/init
directorio (no confundir con/etc/init.d
). Upstart generalmente/etc/init.d/rc
tambié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.conf
script:Pero si necesita dependencias, al menos sistemas de archivos y red, puede tener sentido reemplazar
start on runlevel [02]
con algo como: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".
fuente