Como iniciar um serviço automaticamente, quando o Ubuntu inicia?

31

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.

Alex
fonte

Respostas:

33

Para criar um trabalho para ser iniciado automaticamente quando o Ubuntu iniciar, use o exemplo fornecido aqui . Como exemplo escrito, suponha criar o seguinte arquivo /etc/init/testservice.confcom sudo:

# testservice - test service job file

description "my service description"
author "Me <[email protected]>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

Para iniciar ou parar 'manualmente' o processo, use

sudo start testservice
sudo stop testservice

Veja os comandos de controle do trabalho .

Alex
fonte
Eu precisava "iniciar no mountall iniciado" para iniciar o serviço.
martinedwards 23/03
23

Ok, Alex, o ponto é que todos os processos do espaço do usuário no Linux são iniciados com initprocesso, cujo pid é 1. Por exemplo, corra pstreepara ver a árvore de seus processos, cuja raiz é init. Atualmente existem várias versões de initimplementaçã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 sysVinitinit, 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/inittabarquivo, decide qual o nível de execução a ser executado e diz /etc/init.d/rcao 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/rccomeç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.ddiretório A nomeação desses links simbólicos nos /etc/rc*.ddiretó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-managere depois inicia os processos cujos nomes começam com S. Os dois dígitos após Sou 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.de crie um link simbólico para ele com um nome razoável, por exemplo, S99mytrojanem /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/initdiretório (não confunda com /etc/init.d). O iniciante geralmente /etc/init.d/rctambé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.confscript:

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

Boris Burkov
fonte
1
Esta é uma visão geral muito boa da história do processo iniciada no Linux, mas não responde por pergunta. Ainda não sei como 'criar' um processo inicial. Eu também só quero usá-lo, não entender cada pouquinho de como ele funciona. Eu só queria ter um exemplo de trabalho simples e fácil de usar, de como criar um processo para ser iniciado e reaparecer automaticamente com o iniciante do ubuntu..l.
24413 Alex
@ Alex: atualizado com uma amostra de amostra. Observe que meu script pode muito bem estar errado. Fiz isso no espírito de alexreisner.com/code/upstart .
Boris Burkov
1
Promovido porque esta é uma das melhores respostas que eu já li.
precisa saber é o seguinte