Ok, Alex, il punto è che tutti i processi di userspace in Linux sono avviati con initprocess, il cui pid è 1. Ad esempio, corri pstreeper vedere l'albero dei tuoi processi, la cui radice è init .. Al initgiorno 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 sysVinitinit, 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/inittabfile, decide quale runlevel eseguire e dice /etc/init.d/rcallo 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/rcinizia a eseguire gli script /etc/rc2.d. I file contengono solo collegamenti simbolici agli script, mentre gli script stessi sono memorizzati nella /etc/init.ddirectory. La denominazione di tali collegamenti simbolici nelle /etc/rc*.ddirectory è 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-managerprocessi, perché il suo nome di script inizia con K- K02network-managere quindi avvia i processi, i cui nomi iniziano con S. Le due cifre dopo So Kè il numero compreso tra 00 e 99, che determina l'ordine, i processi vengono avviati. Ad esempio, rsyslogviene 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.de crea un link simbolico con un nome ragionevole, ad esempio
S99mytrojanin /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/initdirectory (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.confsceneggiatura:
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".