Ok, Alex, o ponto é que todos os processos do espaço do usuário no Linux são iniciados com
init process, cujo pid é 1. Por exemplo, execute
pstree para ver a árvore dos seus processos, cuja raiz é init. Existem várias versões da implementação do processo
init atualmente, as mais notáveis são
- sysVinit (init clássico, ainda usado por algumas distribuições, incluindo Debian antigo)
- Upstart init, usado pelo Ubuntu antigo e algumas versões do RHEL (Red Hat) e antigas do Fedora
- systemd init, usado pelas versões modernas do Fedora, Ubuntu, Debian, RHEL, SUSE
Tradicionalmente, os Unix'es usavam a implementação do init chamada sysVinit init, chamada pelo nome de link versão do Unix . É muito influente e outros são retrocompatíveis.
Basicamente, o sysVinit lê primeiro /etc/inittab file, decide qual runlevel executar e diz ao script /etc/init.d/rc para executar os chamados scripts init. Por exemplo. quando ele normalmente inicializa em um nível de execução multiusuário, que geralmente é runlevel 2 no Ubuntu , /etc/init.d/rc inicia a execução de scripts em %código%. Arquivos existem apenas links simbólicos para scripts, enquanto os próprios scripts são armazenados no diretório /etc/rc2.d . A nomeação desses links simbólicos nos diretórios /etc/init.d é a seguinte. Diga, nós temos os seguintes scripts em /etc/rc*.d :
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Isso significa que, ao alternar para o nível de execução 2, o processo de inicialização mata /etc/rc2.d processos, porque o nome do script começa com network-manager - K e inicia os processos, cujos nomes começam com K02network-manager . Os dois dígitos após S ou S são o número de 00 a 99, o que determina a ordem, os processos são iniciados em. K é iniciado antes de rsyslog , porque 16 é menor que 17 (isso faz sentido, porque você deseja que o apache dependa das capacidades de criação de log do rsyslog, portanto o rsyslog deve ser iniciado primeiro). Os scripts são scripts casuais de shell, executados por apache2 .
Então, basicamente para iniciar um programa na inicialização no estilo sysVinit, escreva seu próprio script (copie-colando de qualquer exemplo, você tenha em #!/bin/sh ), coloque-o em /etc/init.d e crie um link simbólico para sob um nome razoável, por exemplo
/etc/init.d em S99mytrojan .
Aqui está uma explicação dos scripts típicos do sysVinit em /etc/init.d link
Agora, os caras do Ubuntu decidiram que querem funcionalidade adicional do init.
Eles queriam um sistema operacional de inicialização rápida, então queriam que seus scripts fossem executados em paralelo; eles queriam que processos mortos fossem automaticamente reiniciados; eles queriam que os processos invocassem um ao outro de maneira explícita por eventos (para que o apache fosse executado pelo evento "syslog started" e o syslog fosse executado pelo evento "file systems mounted" etc., então temos eventos em vez de alguns números 00 -99). Assim, eles fizeram Upstart e aqui é assim que funciona. Os scripts do inits upstart são colocados no diretório /etc/rc2.d (não confunda com /etc/init ). O Upstart normalmente executa /etc/init.d , então ele irá executar seus scripts sysVinit normalmente. Mas se você quiser que seu script seja reaparecido após a saída - os eventos Upstart são para você.
Embora não seja possível verificar se meu script está funcionando, suponho que, para seus objetivos, você deve escrever o seguinte script /etc/init.d/rc :
start on runlevel [02]
respawn
exec mytrojan --argument X
Mas se você precisar de dependências, pelo menos sistemas de arquivos e rede, pode ser útil substituir /etc/init/mytrojan.conf por algo como:
start on (local-filesystems and net-device-up IFACE!=lo)
AVISO: Eu não verifiquei a exatidão disso, porque não posso. Especialmente, não tenho certeza sobre como iniciar o script depois que sua conexão de rede estiver ativa e em execução (usei esta versão ). Tente pesquisar por "upstart on network up".