Existe uma maneira padrão de iniciar e parar serviços no Linux?

15

Até recentemente, havia uma maneira simples e eficaz de iniciar / parar / reiniciar serviços:

service nginx start|stop|restart

Isso funcionou perfeitamente por tantos anos, ... até que alguns smart-pants decidiram melhorá-los e agora estou enfrentando sistemas Debian / Ubuntu nos quais o servicescript não faz nada (como eu devo usar as coisas como systemctl start nginx.service(muito, muito mais, sem trabalho de preenchimento automático, ...)

Minha pergunta se refere especialmente ao Debian e Ubuntu, mas também seria útil para cobrir as distros do CentOS / RedHat.

Então, há algo que pode me salvar dessas mudanças condenadas?

Caso não esteja claro, estou procurando uma maneira consistente de lidar com elas, uma que funcione no Debian 7.x, 8.x, Ubuntu LTS mais recente e não LTS.

PS. Fora do escopo desta pergunta específica, são concedidos elogios extras se a solução também cobrir a parte de habilitar e desabilitar os serviços.

sorin
fonte
5
A conclusão de guias funciona para systemctl para mim ... E, gostemos ou não, systemd é o padrão de fato agora: também pode se acostumar.
Jasonwryan #
1
Extra: se o comando de serviço se tornar inútil, posso removê-lo? Que pacote o fornece?
Sorin
3
Não faz sentido substituir o servicecomando antigo por um wrapper que chama servicectl?
Sorin
4
@jasonwryan Sim, mas você também pode fazer exatamente isso , e um wrapper pode lidar com isso, tornando a transição para o systemd mais suave para os usuários.
Dmitry Grigoryev
2
Será que servicerealmente não fazem nada para você? Funciona como esperado no meu LMDE (que é basicamente o teste do Debian), não achei que isso fosse específico do LMDE. Também funciona como esperado na minha VM do Ubuntu.
terdon

Respostas:

6

Existem vários sistemas de controle de inicialização e serviço variados nas plataformas Unix ao longo de sua história complicada.

O service\chkconfigsistema baseado que você achou simples e eficaz geralmente é chamado de estilo SysVinit e foi um passo importante no caminho para algum tipo de padronização. Você encontrará esse estilo de inicialização no RHEL / CentOS (EL) até a versão 6, no Fedora até 14 e nas distribuições baseadas no Debian / Ubuntu até 2015. Não era o único sistema de inicialização disponível, o estilo BSD (mais simples) O sistema init ainda tem muitos fãs.

O SysVinit não era uma solução perfeita (o que é?) E o Systemd foi desenvolvido para superar muitos dos problemas; este é o systemctlsistema baseado em comando que você está enfrentando agora. Embora não seja universalmente apreciado (as pessoas odeiam mudanças, inchaço, etc.), não há dúvida de que está rapidamente se tornando o padrão defacto na maioria das distribuições.

Portanto, olhando imediatamente para frente, a resposta para sua pergunta original é simplesmente:
A maneira padrão de controlar serviços na maioria das distribuições Linux é agora systemctl!
Quanto tempo isso será verdadeiro é o palpite de alguém; provavelmente apenas até que algo aconteça que seja melhor e se torne amplamente adotado.

Tenho certeza de que haverá invólucros disponíveis para permitir, o seu favorito atual, os service/chkconfigcomandos para continuar a fazer principalmente coisas sãs, mas com essa curva de aprendizado específica, provavelmente é melhor não lutar contra isso. Talvez ansioso, por um tempo também haverá systemctlinvólucros para sistemas mais antigos, para tornar o gerenciamento deles juntamente com os mais atuais menos trabalhoso;)

DanSut
fonte
E antes disso era xinetd, e antes disso era inetd
jas #
@ jas- Eu acho que os inetd são realmente serviços, acredito que eles podem existir em todos os sistemas de inicialização. Eles são um tipo especial de serviço, pois fornecem uma alternativa para outros serviços funcionarem como serviços completos, fornecendo-os sob demanda . No entanto, entendo de onde você é no contexto deste Q, apenas outra maneira de iniciar serviços.
DanSut
Em todas as distribuições; gentoo, centos, redhat, debian, ubuntu etc., xinetd e inetd anteriormente consistiam em pequenos scripts shell para iniciar, parar e recarregar configurações de vários serviços, mas sim, você está certo de que eles eram de fato um serviço exatamente como systemd.
jas-
Ubuntu usado arrivista desde 6.10 e Fedora desde 9 (até que eles foram substituídos por systemd) upstart.ubuntu.com , e tem sido possível mudar Debian longe de sysvinit para muito poucos anos ...
James Tocknell
5

Não faz sentido substituir o servicecomando antigo por um invólucro que chama servicectl[sic]?

Sim, mas [...] um wrapper pode lidar com isso, tornando a transição para o systemd mais suave para os usuários.

… Ou seja, como outros disseram em comentários, o que foi feito há muito tempo .

O /usr/sbin/servicecomando no Debian 8 faz parte do pacote sysvinit-utils. Está presente desde 2009. É uma adição originária do RedHat específica ao Debian ao pacote fonte sysvinit original e, como pode ser visto na leitura do script, reconhece a execução do sistema e a presença de trabalhos iniciais, desenvolvendo comandos para systemctle initctl( através de seus apelidos), respectivamente. Isso é feito desde 2013.

service name actionestá amplamente disponível, mesmo em sistemas operacionais não Linux. Até funcionará na maioria dos BSDs, pois eles também têm seus próprios servicecomandos. Há também um servicecomando shim no pacote nosh que se traduz em . Mas …system-control action name

  • ... supere esse subconjunto comum e há muito menos compatibilidade ao redor.
  • ... O OpenBSD não tem servicecomando.
  • … Os servicecomandos do BSD têm problemas bem conhecidos de longa data sobre os quais os administradores de sistemas contam histórias de guerra há décadas.

Ativar e desativar serviços é uma situação semelhante. Embora o SuSE chkconfigprograma (disponível empacotado para o Debian e Ubuntu) é muito diferente ao do Fedora um (que está sendo escrito em inteiramente diferentes linguagens de programação, mesmo - um compilado, um interpretado), há um mínimo comum de sintaxe, com ação ser ou . Mas …chkconfig name actiononoff

  • ... novamente, além desse subconjunto comum, há menos compatibilidade.
  • ... não há chkconfignos BSDs, pois as ferramentas convencionais para isso são sysrco OpenBSD rcctl enablee o rcctl disable. Existem chkconfige rcctlshims no pacote nosh que são traduzidos para e .system-control enable namesystem-control disable name
  • … Somente o Fedora chkconfigconhece o systemd e atua como um calço para systemctl enablee systemctl disable. O SuSE chkconfignão tem conhecimento de systemd.

Leitura adicional

JdeBP
fonte
2

Não há uma maneira padrão de iniciar e parar serviços no Linux.

existe algo que possa me salvar dessas mudanças condenadas?

Experimente a ferramenta de gerenciamento / orquestração de configurações: Ansible , Chef , Saltstack , Puppet ou o que for.

Você pode iniciar e ativar um serviço com o Ansible:

ansible all -i inv -m service -a 'name=service-name state=started enabled=true'

Dê uma olhada na classe LinuxService no servicemódulo do Ansible :

Esta é a classe de manipulação do Serviço Linux - atualmente ela suporta uma mistura de binários e scripts init para controlar os serviços iniciados na inicialização, bem como para controlar o estado atual.

Evgeny Vereshchagin
fonte
De alguma forma, parece que os caras do Ubuntu conseguiram manter o script de serviço funcionando depois de mudar para o systemd. Olhando para dentro, parece ser inteligente o suficiente para usar o back-end correto. Não posso dizer o mesmo sobre o Debian.
sorin
1

Seu problema é que o Debian / Ubuntu mudou para o novo systemdcomo um substituto do antigo sysvinit. Pergunte qual é o melhor e você iniciará uma guerra de chamas, mas você sempre pode voltar para o antigo sysvinit; verifique isso se quiser voltar.

YoMismo
fonte