Por que o serviço service_name dá respostas diferentes para diferentes serviços?

3

Executar o comando "service service_name status" fornece três tipos diferentes de saída quando três service_names diferentes são usados. Eu tentei com atftpd, apache2 e isc-dhcp-server, como mostrado abaixo.

user@host:~$ service atftpd status
Usage: /etc/init.d/atftpd {start|stop|restart|reload|force-reload}
user@host:~$ service apache2 status
Apache2 is running (pid 1103).
user@host:~$ service isc-dhcp-server status
isc-dhcp-server start/running, process 5696

Isso pode ser porque o atftpd não foi convertido para o Upstart?

O status para o isc-dhcp-server mostra "start / running", que indica que foi convertido para usar o Upstart. Eu teria pensado que o apache2 já teria sido convertido para o Upstart. Se tiver, por que não exibe "start / running"?

    
por Code Ghar 17.10.2012 / 22:06

2 respostas

1

Acho que posso entender um pouco mais depois de fazer algumas pesquisas no Ubuntu e também pesquisando coisas. Todos os serviços não foram portados para o Upstart.

ls -l /etc/init.d/

O comando acima lista todos os arquivos, mas estamos interessados em alguns.

-rwxr-xr-x 1 root root 7621 Feb  6  2012 apache2
-rwxr-xr-x 1 root root 1511 Oct 17  2011 atftpd
lrwxrwxrwx 1 root root   21 Sep 14 10:57 isc-dhcp-server -> /lib/init/upstart-job

Como você pode ver, o apache2 e o atftpd ainda não foram convertidos para o Upstart enquanto o isc-dhcp-server tinha. Vamos listar arquivos em outro diretório.

ls -l /etc/init

Novamente, muitos arquivos são listados, mas estamos interessados em apenas um:

-rw-r--r-- 1 root root 1704 Sep 14 10:56 isc-dhcp-server.conf

Isso confirma que o isc-dhcp-server foi convertido para o Upstart, mas o apache2 e o atftpd não.

Mas agora a questão é se devemos usar os antigos comandos invoke-rc.d ou /etc/init.d / para iniciar / parar / etc. serviços, ou use o comando service , ou use o comando initctl (Upstart)? A resposta que eu entendo melhor é sempre usar o comando service . Com base em como os arquivos init são configurados em /etc/init.d/, service usará o initctl (ou start ou stop ) para serviços convertidos para Upstart e usar os mais antigos /etc/init.d / para serviços que não foram convertidos. Como usuários, não precisamos nos preocupar e sempre usar serviço . Disclaimer: Eu testei isso apenas no Ubuntu 12.04.

    
por Code Ghar 17.10.2012 / 23:50
0

Correto, isso ocorre porque você está verificando o status de dois tipos de serviço, um é Upstart ntive (isc-dhcp-server) e os outros dois são System V . Um desses scripts SysV (atftpd) não suporta o comando status. O subcomando status não é um comando de script init obrigatório, diferente de start e stop .

O motivo pelo qual o Apache não foi convertido para o Upstart está em como ele se desvia dos processos. Em suma, o Upstart usa o recurso kernel ptrace () para seguir os garfos, mas ele apenas rastreia garfos e não saídas, assume que o processo pai desapareceu. Para encurtar a história, isso não é compatível com a maneira como certos daemons lidam com bifurcações, como o apache2 e o postfix.

Estes dois velhos bugs , chegue ao cerne da questão.

Algumas pessoas tiveram um pouco de sucesso escrevendo seus próprios trabalhos Upstart e iniciar o Apache com uma opção "no detach", mas isso não é suportado e, se você não for cuidadoso, uma atualização de pacote poderá prejudicar suas alterações. Os scripts de inicialização e os trabalhos do Upstart não devem ser editados pelo usuário. O Dpkg considera isto um conflito e irá avisá-lo quando atualizar. Se você não tiver um motivo específico para trocar o Apache por um trabalho nativo do Upstart, eu ficaria com o script de inicialização. Nota: o caminho para corretamente modificar os trabalhos do Upstart é criar um arquivo .override [veja man 5 init ].

No futuro, o Upstart pode alternar de ptrace () para usar cgroups para gerenciar grupos de processos, o que removeria esse tipo de problema. Mas isso ainda está no horizonte, eu acredito.

    
por Mark Russell 18.10.2012 / 00:21