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".