Ok, Alex, o ponto é que todos os processos do espaço do usuário no Linux são iniciados com init
processo, cujo pid é 1. Por exemplo, corra pstree
para ver a árvore de seus processos, cuja raiz é init. Atualmente existem várias versões de init
implementação de processos. , os mais notáveis são
- sysVinit (init clássico, ainda usado por algumas distribuições, incluindo Debian mais antigo)
- Inicialização inicial, usada pelo Ubuntu mais antigo e algumas versões do RHEL (Red Hat) e do Fedora mais antigas
- systemd init, usado pelas versões modernas do Fedora, Ubuntu, Debian, RHEL, SUSE
Tradicionalmente, o Unix usava a implementação init chamada sysVinit
init, chamada pelo nome de https://ru.wikipedia.org/wiki/UNIX_System_V versão do Unix. É muito influente e outras inits são retrocompatíveis.
Basicamente, o sysVinit primeiro lê o /etc/inittab
arquivo, decide qual o nível de execução a ser executado e diz /etc/init.d/rc
ao script para executar os chamados scripts init. Por exemplo, quando ele normalmente é inicializado em um nível de execução para vários usuários, que normalmente é o nível de execução 2 no Ubuntu , /etc/init.d/rc
começa a executar scripts no /etc/rc2.d
. Os arquivos existem apenas links simbólicos para scripts, enquanto os próprios scripts são armazenados no /etc/init.d
diretório A nomeação desses links simbólicos nos /etc/rc*.d
diretórios é a seguinte. Digamos, temos os seguintes scripts em /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Isso significa que, ao mudar para o processo init do nível 2, o processo mata primeiro network-manager
, faz com que o nome do script comece com K
- K02network-manager
e depois inicia os processos cujos nomes começam com S
. Os dois dígitos após S
ou K
é o número de 00 a 99, que determina a ordem em que os processos são iniciados. Por exemplo, rsyslog
é iniciado antes apache2
, porque 16 é menor que 17 (isso faz sentido, porque você deseja que o apache dependa das capacidades de log do rsyslog , portanto, o rsyslog deve ser iniciado primeiro). Os scripts são shell scripts casuais, executados por #!/bin/sh
.
Então, basicamente, para iniciar um programa na inicialização no estilo sysVinit, escreva seu próprio script (copie-o de qualquer exemplo que você tenha encontrado /etc/init.d
), coloque-o /etc/init.d
e crie um link simbólico para ele com um nome razoável, por exemplo,
S99mytrojan
em /etc/rc2.d
. Aqui está uma explicação dos scripts sysVinit típicos em /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
Agora, os caras do Ubuntu decidiram que desejam funcionalidades adicionais a partir 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 os processos mortos fossem reiniciados automaticamente; eles queriam que os processos se invocassem de maneira explícita por eventos (para que o apache seja executado pelo evento "syslog iniciado" e o syslog seja executado pelo evento "sistemas de arquivos montados" etc.), portanto, temos eventos em vez de alguns números 00 -99). Assim, eles criaram o Upstart e aqui está como ele funciona. Initscripts iniciantes são colocados no /etc/init
diretório (não confunda com /etc/init.d
). O iniciante geralmente /etc/init.d/rc
também é executado , portanto, ele executa os scripts sysVinit normalmente. Mas se você deseja que seu script seja reaparecido na saída - os eventos iniciados são para você.
Embora eu não possa verificar se meu script está funcionando, suponho que, para seus objetivos, você deve escrever o seguinte /etc/init/mytrojan.conf
script:
start on runlevel [02]
respawn
exec mytrojan --argument X
Mas se você precisar de dependências, pelo menos sistemas de arquivos e rede, pode fazer sentido substituir start on runlevel [02]
por algo como:
start on (local-filesystems and net-device-up IFACE!=lo)
AVISO: Não verifiquei a exatidão disso, porque não posso. Especialmente, não tenho muita certeza de como iniciar o script após a conexão de rede estar em funcionamento (usei esta versão ). Tente pesquisar no Google por "iniciante na rede".