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

14

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 algumas smart-pants decidiram melhorá-las e agora estou enfrentando com sistemas Debian / Ubuntu onde o script service não faz nada (como eu deveria usar o material como systemctl start nginx.service (muito mais tempo, nenhum trabalho de preenchimento automático, ...)

Minha pergunta se refere especialmente ao Debian e ao Ubuntu, mas também seria útil cobrir as distribuições CentOS / RedHat.

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

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

PS. Fora do escopo desta questão específica, mas kudos extras são concedidos se a solução também cobrir a parte de ativação e desativação dos serviços.

    
por sorin 01.10.2015 / 08:53

4 respostas

6

Houve vários sistemas de controle de inicialização e serviço variados em plataformas Unix sobre seu histórico complicado.

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

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

Portanto, olhando imediatamente para a frente, a resposta à sua pergunta original é simplesmente:
A maneira padrão de controlar serviços em mais distribuições Linux agora é systemctl !
Quanto tempo isso será verdadeiro, ninguém sabe; provavelmente só até que apareça algo que seja melhor e se torne amplamente adotado.

Tenho certeza de que haverá wrappers disponíveis para permitir, seu favorito atual, que os comandos service/chkconfig continuem a fazer coisas sãs, mas com essa curva de aprendizado específica é melhor não lutar contra isso. Talvez olhando para a frente, por um tempo, haverá também systemctl de wrappers para sistemas mais antigos, para torná-los mais fracos do que os atuais;)

    
por 01.10.2015 / 12:29
5

Doesn't [it] make sense to replace the old service command with a wrapper that calls servicectl [sic] instead?

Yes, but […] a wrapper could handle it, making the transition to systemd smoother for the users.

… o que é, como outros já disseram nos comentários, o que foi feito há muito tempo .

O comando /usr/sbin/service no Debian 8 faz parte do pacote sysvinit-utils. Ele existe desde 2009. É uma adição específica do Debian, originada no RedHat, para o pacote fonte original do sysvinit, e como pode ser visto lendo o script, ele reconhece tanto o systemd rodando quanto a presença de jobs iniciantes, cultivando comandos para systemctl e initctl (por meio de seus aliases) respectivamente. Isso tem feito desde 2013.

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

  • … vá além desse subconjunto comum e há muito menos compatibilidade por toda parte.
  • … O OpenBSD não possui o comando service .
  • … os comandos BSD service têm problemas bem conhecidos de longa data pelos quais os administradores de sistemas vêm contando histórias de guerra há décadas.

Ativar e desativar serviços é uma situação semelhante. Embora o programa SuSE chkconfig (disponível para o Debian e Ubuntu) seja muito diferente do Fedora (sendo escritos em linguagens de programação totalmente diferentes, mesmo - um compilado, um interpretado), existe um mínimo comum chkconfig name action sintaxe, com ação sendo on ou off . Mas…

  • … novamente, além desse subconjunto comum, há menos compatibilidade.
  • … não há chkconfig nos BSDs, pois as ferramentas convencionais para isso são sysrc ou o mais recente OpenBSD rcctl enable e rcctl disable . Existem chkconfig e rcctl shims no pacote nosh que traduzem para system-control enable name e system-control disable name .
  • … apenas o Fedora chkconfig conhece o systemd e age como um shim para systemctl enable e systemctl disable . O SuSE chkconfig não tem conhecimento de systemd.

Leitura adicional

por 04.10.2015 / 15:48
2

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

is there something that can save me from this doomed changes?

Tente a ferramenta de gerenciamento / orquestração de configuração: Ansible , Chef , Saltstack , Puppet ou qualquer outra coisa.

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

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

Dê uma olhada na LinuxService classe no service módulo:

This is the Linux Service manipulation class - it is currently supporting a mixture of binaries and init scripts for controlling services started at boot, as well as for controlling the current state.

    
por 02.10.2015 / 04:26
1

Seu problema é que o Debian / Ubuntu mudou para o novo systemd como um substituto do antigo sysvinit . Pergunte qual é o melhor e você vai começar uma guerra de chamas, mas você sempre pode voltar para o antigo sysvinit , check isto se você quiser voltar.

    
por 01.10.2015 / 12:38