Como funcionam os serviços no Debian, e como posso gerenciá-los?

67

No Windows eu tenho o gerenciador de serviços, onde vejo todos os serviços do sistema, que podem ser iniciados pelo próprio Windows, configuro o usuário que ele usa, o gerenciamento de direitos está lá e posso passar variáveis e algumas outras informações para os serviços, posso nomeá-los, e posso criar serviços duplicados de um programa e assim por diante. Então eu tenho uma ferramenta de gerenciamento principal no Windows.

Como posso fazer o mesmo no Linux? Como posso disparar para executar "svnserve" na inicialização ou como posso configurar serviços para serem executados em um contexto especial. Como posso ver todos os serviços "programados"?

    
por Erdinc Ay 26.12.2013 / 12:40

3 respostas

108

Existem atualmente 3 principais sistemas init usados pelo linux. Há alguns anos, havia apenas um, o SysVinit. Mas o SysVinit estava seriamente carente de recursos, como gráficos de dependência de serviços, por isso já está obsoleto na maioria das distros. Atualmente, a maioria das distros está mudando para systemd . Embora também haja upstart .

Mas aqui está a resposta para sua pergunta para cada um dos três sistemas init:

SysVinit

SysVinit atualmente usado pelo Debian e pelo RedHat. Embora a próxima versão do RedHat (7) esteja usando o systemd.

A maneira universal de ativar os serviços do SysVinit na inicialização é ligá-los simbolicamente em /etc/rc3.d (ou /etc/rc2.d ). Todos os serviços podem ser encontrados em /etc/init.d . No entanto, observe que as distribuições muitas vezes têm sua própria ferramenta para gerenciar esses arquivos, e essa ferramenta deve ser usada em seu lugar. (Fedora / RedHat tem service e chkconfig , o ubuntu tem update-rc.d )

Listar serviços:

ls /etc/init.d/

Iniciar serviço:

/etc/init.d/{SERVICENAME} start

Parar serviço:

/etc/init.d/{SERVICENAME} stop

Ativar serviço:

cd /etc/rc3.d
ln -s ../init.d/{SERVICENAME} S95{SERVICENAME}

(o S95 é usado para especificar a ordem. S01 será iniciado antes de S02, etc)

Desativar serviço:

rm /etc/rc3.d/*{SERVICENAME}

Systemd

A distribuição mais notável usando o systemd é o Fedora. Embora seja usado por muitos outros. Além disso, com o Debian tendo escolhido o systemd over start, ele se tornará o sistema defact-up para a maioria das distribuições (o ubuntu já anunciou que lançará o upstart para o systemd).

Listar serviços:

systemctl list-unit-files

Iniciar serviço:

systemctl start {SERVICENAME}

Parar serviço:

systemctl stop {SERVICENAME}

Ativar serviço:

systemctl enable {SERVICENAME}

Desativar serviço:

systemctl disable {SERVICENAME}

Upstart

O Upstart foi desenvolvido pelo pessoal do Ubuntu. Mas depois que o debian decidiu usar o systemd , o Ubuntu anunciaram que abandonariam o .

Upstart também foi brevemente usado pelo RedHat, como está presente no RHEL-6, mas não é comumente usado.

Listar serviços:

initctl list

Iniciar serviço:

initctl start {SERVICENAME}

Parar serviço:

initctl stop {SERVICENAME}

Ativar serviço:

2 maneiras infelizmente:

  1. Haverá um arquivo /etc/default/{SERVICENAME} que contém uma linha ENABLED=... . Altere esta linha para ENABLED=1 .

  2. Haverá um arquivo /etc/init/{SERVICENAME}.override . Certifique-se de que contenha start (ou esteja totalmente ausente), não manual .

Desativar serviço:

echo manual > /etc/init/{SERVICENAME}.override

Nota: Existe também o sistema init 'OpenRC' que é usado pelo Gentoo. Atualmente, o Gentoo é a única distro que o usa, e não está sendo considerado para uso, nem suportado por nenhuma outra distro. Então, eu não estou cobrindo o seu uso (embora se a opinião é que eu faço, eu posso adicionar).

    
por 26.12.2013 / 15:32
7

Diferentes distribuições usam mecanismos diferentes para gerenciar serviços. O software para gerenciar serviços é chamado de init , após o nome tradicional para o primeiro processo (com ID do processo 1), que é encarregado de iniciar os outros.

O Debian usa a variante tradicional SysVinit do init. Sob este sistema, há uma coleção de scripts no diretório /etc/init (este e outros locais podem variar um pouco entre as distribuições que usam o SysVinit). Esses scripts não são chamados diretamente, mas através de links simbólicos nos diretórios /etc/rc?.d . É a presença e o nome desses links simbólicos que determinam quando os serviços são iniciados. Para mais detalhes, leia o capítulo sobre o init na Referência Debian .

Dê uma olhada em /etc/rc?.d para ver quais serviços já estão presentes. A letra ou dígito antes do ponto é o runlevel; as entradas cujo nome começa com S são executadas com o argumento start ao entrar no nível de execução e as entradas cujo nome começa com K são executadas ao sair do nível de execução. A seqüência de nível de execução normal é: S durante a inicialização (portanto, /etc/rcS.d/S* são executados) e, em seguida, 2 (então, /etc/rc2.d/S* são executados). No momento do desligamento, /etc/rc2.d/K* são executados, então o nível de execução muda para 0 (ou 6 para uma reinicialização).

Em poucas palavras, se você quiser criar um script de inicialização para um novo serviço:

  • Escreva um script de shell em /etc/init.d . Este script deve aceitar um argumento que pode ser start , stop , force-reload , restart ou (opcional) reload ou status . A diferença entre reload e restart é que restart é equivalente a stop seguido de start , enquanto reload recarrega a configuração sem interromper nada (se o serviço oferecer suporte); force-reload faz reload se disponível e restart caso contrário. Veja os arquivos existentes e Fazendo os scripts rodarem no boot com o Debian para exemplos.
  • Execute update-rc.d para criar links simbólicos para iniciar e pare seu serviço. A maioria dos serviços é executada nos runlevels 2, 3, 4 e 5.

Note que para fornecer acesso svn, pode ser mais fácil configurar o Apache e usar o protocolo HTTP ou HTTPS. Isso tem o benefício de permitir a rápida navegação no repositório através de um navegador da Web.

    
por 27.12.2013 / 02:45
2

De um contexto unix tradicional não há nada especial sobre serviços, eles são apenas outro processo, com duas exceções: eles não precisam de um terminal e são iniciados na inicialização. como eles são iniciados no boot depende do init (que pode ser init sysv, init bsd, upstart, systemd ou qualquer outra coisa; verifique sua página de manual para init) e seu tempo está usando um wrapper para a tarefa ou para a configuração init. Não há nada que impeça você de executar um serviço a partir de um terminal; na verdade, é comum para fins de teste.

    
por 26.12.2013 / 17:30