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, ejecuta pstree
para ver el árbol de tus procesos, cuya raíz es init. Actualmente hay varias versiones de init
implementació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 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
:
$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-manager
procesos, porque su nombre de script comienza con K
, K02network-manager
y luego comienza los procesos, cuyos nombres comienzan con S
. Los dos dígitos después S
o K
es el número de 00 a 99, que determina el orden en el que se inician los procesos. Por ejemplo, rsyslog
se 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.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.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/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:
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".