Ok, Alex, il punto è che tutti i processi di userspace in Linux sono avviati con init
process, il cui pid è 1. Ad esempio, corri pstree
per vedere l'albero dei tuoi processi, la cui radice è init .. Al init
giorno d'oggi ci sono diverse versioni dell'implementazione del processo , i più notevoli sono
- sysVinit (init classico, ancora usato da alcune distribuzioni, incluso Debian precedente)
- Upstart init, usato da Ubuntu precedente e da alcune versioni RHEL (Red Hat) e Fedora precedenti
- systemd init, utilizzato dalle moderne versioni Fedora, Ubuntu, Debian, RHEL, SUSE
Tradizionalmente, Unix utilizzava l'implementazione di init chiamata sysVinit
init, chiamata con il nome di https://ru.wikipedia.org/wiki/UNIX_System_V versione di Unix. È molto influente e altri init sono retrocompatibili.
Fondamentalmente, sysVinit legge prima il /etc/inittab
file, decide quale runlevel eseguire e dice /etc/init.d/rc
allo script di eseguire i cosiddetti script init. Ad esempio, quando normalmente si avvia su un runlevel multiutente, che di solito è runlevel 2 su Ubuntu , /etc/init.d/rc
inizia a eseguire gli script /etc/rc2.d
. I file contengono solo collegamenti simbolici agli script, mentre gli script stessi sono memorizzati nella /etc/init.d
directory. La denominazione di tali collegamenti simbolici nelle /etc/rc*.d
directory è la seguente. Dì, abbiamo i seguenti script in /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Significa che quando si passa al processo runlevel 2 init prima uccide i network-manager
processi, perché il suo nome di script inizia con K
- K02network-manager
e quindi avvia i processi, i cui nomi iniziano con S
. Le due cifre dopo S
o K
è il numero compreso tra 00 e 99, che determina l'ordine, i processi vengono avviati. Ad esempio, rsyslog
viene avviato prima apache2
, perché 16 è inferiore a 17 (ciò ha senso, perché si desidera che Apache faccia affidamento sulle capacità di registrazione di rsyslog , quindi rsyslog dovrebbe essere avviato per primo). Gli script sono script shell casuali, eseguiti da #!/bin/sh
.
Quindi, fondamentalmente per avviare un programma all'avvio in stile sysVinit, scrivi il tuo script (copiandolo da qualsiasi esempio, ci sei dentro /etc/init.d
), mettilo /etc/init.d
e crea un link simbolico con un nome ragionevole, ad esempio
S99mytrojan
in /etc/rc2.d
. Ecco una spiegazione dei tipici script sysVinit in /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
Ora, i ragazzi di Ubuntu hanno deciso di volere funzionalità aggiuntive da init. Volevano un sistema operativo ad avvio rapido, quindi volevano che i loro script fossero eseguiti in parallelo; volevano che i processi morti fossero riavviati automaticamente; volevano che i processi si invocassero l'un l'altro in modo esplicito dagli eventi (in modo che apache sia gestito dall'evento "syslog avviato", e syslog sia gestito dall'evento "montato sui file system" ecc., quindi abbiamo eventi invece di alcuni numeri 00 -99). Quindi, hanno creato Upstart ed ecco come funziona. Gli initscript upstart vengono inseriti nella /etc/init
directory (da non confondere /etc/init.d
). Anche Upstart di solito funziona /etc/init.d/rc
, quindi eseguirà normalmente i tuoi script sysVinit. Ma se vuoi che la tua sceneggiatura venga rigenerata all'uscita, gli eventi Upstart sono per te.
Anche se non riesco a verificare che la mia sceneggiatura funzioni, suppongo che per i tuoi scopi, dovresti scrivere la seguente /etc/init/mytrojan.conf
sceneggiatura:
start on runlevel [02]
respawn
exec mytrojan --argument X
Ma se hai bisogno di dipendenze, almeno filesystem e rete, può essere logico sostituirlo start on runlevel [02]
con qualcosa come:
start on (local-filesystems and net-device-up IFACE!=lo)
ATTENZIONE: non ho verificato la correttezza di questo, perché non posso. In particolare, non sono del tutto sicuro di come avviare lo script dopo che la connessione di rete è attiva e funzionante (ho usato questa versione ). Prova a cercare su Google "upstart on network up".