Estou usando o Ubuntu 12.04 e quero iniciar um serviço, quando o sistema é inicializado normalmente.
Como 'serviço', eu entendo algum código, por exemplo, cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x que deve estar em execução como se tivesse sido iniciado na linha de comandos. Existem serviços a serem iniciados como usuário normal, mas também serviços a serem iniciados como raiz (na verdade, não é necessário que os serviços sejam executados no nível do usuário).
Também preciso configurar o comportamento quando um 'serviço' parar. Eu quero que eles sejam reiniciados no meu caso, com o mesmo argumento, em um diretório especificado.
Todos os serviços devem ser iniciados automaticamente quando o sistema é iniciado normalmente, ou seja, se o botão liga / desliga for pressionado. Nenhuma outra ação deve ser necessária.
Existem alguns documentos espalhados na internet, mas todos me confundem. Eles falam sobre init
, init.d
, rc.d
, mas eu nunca vi uma instrução passo-a-passo simples de seguir para facilmente como um serviço usando, por exemplo arrivista. Se isso for fácil, eu apreciaria se essas etapas forem dadas aqui.
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, corrapstree
para ver a árvore de seus processos, cuja raiz é init. Atualmente existem várias versões deinit
implementação de processos. , os mais notáveis sãoTradicionalmente, 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
: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 comK
-K02network-manager
e depois inicia os processos cujos nomes começam comS
. Os dois dígitos apósS
ouK
é o número de 00 a 99, que determina a ordem em que os processos são iniciados. Por exemplo,rsyslog
é iniciado antesapache2
, 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.htmlAgora, 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: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: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".
fonte