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

29

Estou usando o Ubuntu 12.04 e quero que um serviço seja iniciado, quando o sistema for inicializado normalmente.

Como 'serviço' eu entendo algum código, por exemplo     cd meu_diretório; my_command -host 0.0.0.0 -port 1234 -arg x que só deveria estar rodando como se tivesse sido iniciado na linha de comando. Existem serviços a serem iniciados como usuário normal, mas também serviços a serem iniciados como root (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' é interrompido. 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 interruptor de energia for pressionado. Nenhuma outra ação deve ser necessária.

Existem alguns documentos espalhados pela internet, mas todos eles me confundem. Eles falam sobre init , init.d , rc.d , mas nunca vi uma instrução passo a passo fácil de seguir para facilitar como um serviço usando, por exemplo, arrivista. Se isso for fácil, eu apreciaria se esses passos fossem dados aqui.

    
por Alex 24.07.2013 / 15:44

2 respostas

32

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.conf com 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 'manualmente' iniciar ou parar o processo use

sudo start testservice
sudo stop testservice

Veja os comandos de controle de trabalho .

    
por 24.07.2013 / 18:39
22
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".

    
por 24.07.2013 / 16:45