Diferença entre systemctl init.d e service

40

Eu sou novo no linux e tenho me testado usando uma instância do Amazon Lightsail (Ubuntu 16.04 LTS).

Percorrendo os vários guias que encontrei, vejo pessoas usando comandos diferentes para iniciar / parar / reiniciar / recarregar / verificar o status de um serviço. Especificamente estes;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Todos os comandos acima funcionam.

  1. Devo preferir um comando ao outro?
  2. Se sim, por que?
  3. Existem outros comandos que eu preciso conhecer?

O uso do init.d no Monit causou problemas quando eu quis usar a opção status (o status será que o serviço está offline quando na verdade estava online - reiniciado pelo Monit). Altere o código no Monit de inid.d para / bin / systemctl corrigido.

Parece que o uso do init.d fornece mais informações sobre o que aconteceu com os outros. Se eu deveria estar usando um dos outros comandos, é possível que eles exibam mais informações sobre o que foi feito?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

Gostaria de agradecer antecipadamente a todos que se dispuseram a ler e responder a esta pergunta.

Waqas Tariq
fonte
No Linux, geralmente há mais de uma maneira de executar uma ação. Não existe alguém que seja melhor ou pior, certo ou errado. Pessoalmente, eu uso o que menos digita. Muitos desses comandos podem ser links simbólicos ou compatibilidade retroativa conforme o Ubuntu muda para systemd.
Panther
systemctlé a sintaxe preferida e serviceé fornecida como compatibilidade com versões anteriores. /etc/init.d/pure-ftpdou similares estão chamando os scripts de start / stop diretamente.
Panther

Respostas:

57

Para começar, há toda uma história e luta entre ir de e SysVInitpara SystemD. Em vez de tentar resumir tudo isso em uma resposta, refiro-lhe a alguns sites do Google que se aventuram para obter mais detalhes sobre a história, além de um artigo específico sobre o assunto:

http://www.tecmint.com/systemd-replaces-init-in-linux/

Em resumo, porém, tem sido uma transição lenta e árdua. Alguns recursos herdados foram mantidos intactos (como init.daté certo ponto). Se você tiver a opção de usar systemctlpara o seu controle de serviço, recomendo usá-lo. É o futuro previsível para Linux e, eventualmente, SysVInitmétodos mais antigos serão considerados totalmente obsoletos e removidos.

Para cobrir cada um que você listou especificamente:

  1. sudo systemctl status apache2.service

Essa é a nova SystemDabordagem para lidar com serviços. No futuro, os aplicativos no Linux foram projetados para usar o método systemd, e não qualquer outro.

  1. sudo /bin/systemctl status apache2.service

É a mesma coisa que o comando anterior. A única diferença nesse caso é que não depende da $PATHvariável de ambiente do shell para encontrar o comando, ele está listando explicitamente o comando, incluindo o caminho para o comando.

  1. sudo /etc/init.d/apache2 status

Este é o SysVInitmétodo original de chamar um serviço. Os scripts de inicialização seriam gravados para um serviço e colocados nesse diretório. Embora esse método ainda seja usado por muitos, servicefoi o comando que substituiu esse método de chamar serviços SysVInit. Existem algumas funcionalidades herdadas para isso em sistemas SystemDmais recentes, mas a maioria dos programas mais recentes não inclui isso, e nem todos os scripts de inicialização de aplicativos mais antigos funcionam com ele.

  1. sudo service apache2 status

Essa foi a principal ferramenta usada nos SysVInitsistemas para serviços. Em alguns casos, apenas vinculou aos /etc/init.d/scripts, mas em outros casos foi para um script init armazenado em outro local. O objetivo era fornecer uma transição mais suave para o tratamento de dependências de serviço.


Por fim, você menciona que deseja saber como obter mais informações dos comandos, pois alguns fornecem mais informações que outros. Isso quase sempre é determinado pelo aplicativo e como eles projetaram seu arquivo de inicialização ou serviço. Como regra geral, porém, se concluído silenciosamente, foi bem-sucedido. No entanto, para verificar um start, stopou restart, você pode usar o statussub-comando para ver como ele está fazendo. Você mencionou um statuscomando incorreto em um script init antigo. Esse é um bug que os desenvolvedores de aplicativos precisariam examinar. No entanto, como os scripts init estão se tornando o método descontinuado de manipulação de serviços, eles podem simplesmente ignorar o erro até remover completamente a opção de script init. osystemctl status sempre deve funcionar corretamente, caso contrário, um bug deve ser registrado com os desenvolvedores do aplicativo.

Cartola
fonte
Muito obrigado pela sua resposta detalhada. Eu também estou pesquisando no Google por respostas, mas essa realmente me confundiu, então eu as publiquei aqui. Também vejo que o status do sudo systemctl apache2 funciona, em vez de (status do sudo systemctl apache2.service). Existe algum dano ao abrir a parte .service?
Waqas Tariq
@WaqasTariq no problem! Ambos devem funcionar, systemctlprocurará nos diretórios onde os arquivos de serviço estão armazenados e adicionará o ".service" para você, se o encontrar. Por exemplo, se você pressionar a tecla tab uma vez depois de escrever sudo systemctl status apache2, deverá concluí-la adicionando .servicepara você. Se houver mais de um arquivo systemctl apache2 (como .servicee .targetvocê tem que guia hit duas vezes para que ele mostra todas as opções disponíveis.
TopHat
Consegui. Obrigado por suas respostas e seu tempo.
Waqas Tariq
@WaqasTariq your welcome!
TopHat