Listar todos os serviços começando na inicialização

15

Estou procurando uma maneira de obter uma lista de todos os serviços (/etc/init.d ou upstart ou systemd), que deveriam estar iniciando (ou tendo sido iniciados na) inicialização.

Como você obtém uma lista de todos os serviços iniciais? - Eu conheço essa pergunta, e ela sugere usarservice --status-all .

Mas isso não me mostra quais serviços deveriam funcionar . Ele chama todos os scripts init com " status" argumento. Esta é uma lista de todos os serviços que podem estar em execução.

Mas eu gostaria de saber se um serviço que foi iniciado na inicialização ainda está em execução.

Exemplo…

Eu tenho webfs instalados. Mas eu não quero que ele esteja sendo executado na inicialização. Assim eu desativou: sudo update-rc.d webfs disable. E eu também tenho o samba instalado e ele deve estar sendo executado na inicialização. Mas está parado (por qualquer motivo). sudo service --status-allnão me ajuda aqui:

$ sudo service --status-all 2>/dev/null | grep -E 'samba$|webfs'
 [ - ]  samba
 [ - ]  webfs

Ambos estão desligados, mas não tenho idéia, de que um (samba) deve estar ligado.

Então…

Como eu pude obter uma lista de todos os serviços que estão iniciando na inicialização?E, como uma extensão, existe uma maneira fácil de obter o "status" desses serviços (se não, eu simplesmente percorrerei esta lista e executarei "service $ service status", ou algo assim).

Obrigado Alexander

Editar 04-05-2015: Estou no Ubuntu 14.04.

O foco principal desta pergunta é o seguinte:

Mas eu gostaria de saber se um serviço que foi iniciado na inicialização ainda está em execução.

Por isso, initctl listnão ajuda muito. Realmente não leva em consideração os serviços iniciados pelos /etc/init.dscripts (em comparação com os scripts iniciais /etc/init).

Também uma lista de /etc/rc?.d/S*não ajuda. Isso geraria uma lista de serviços, que poderiam ter sido iniciados em um determinado nível de execução. Não me mostra se um serviço que deveria ter sido iniciado ainda está em execução.

Basicamente, estou procurando algo como o svcs -xSolaris para Ubuntu. Com svcs -x, eu teria saída se um serviço iniciado, não estivesse mais em execução. Isso, eu precisaria do Ubuntu também.

Motivo: eu gostaria de fazer uma verificação (mais ou menos ...) genérica para o nosso sistema de monitoramento Icinga / Nagios, que me alertaria se um serviço não estivesse mais sendo executado, que deveria estar em execução. Como temos muitos servidores diferentes para muitos clientes, não é realmente possível definir uma lista de serviços "importantes".

Alexander Skwar
fonte
Qual versão do Ubuntu?
AB
@Parto a resposta aceita naquela questão é initctl listque lista os processos que são iniciados / corrida, mas essa lista também inclui processos que são iniciados manualmente
Sergiy Kolodyazhnyy
@AB Estou no Ubuntu 14.04.
Alexander Skwar
O @Parto askubuntu.com/questions/218/… não fornece uma resposta. Como o @Serg escreveu, a resposta era usar initctl list. Mas isso realmente não responde, pois também mostraria serviços iniciados manualmente. E não mostra serviços que não estão em execução.
Alexander Skwar

Respostas:

19

Todos os serviços iniciam na inicialização:

initctl list

Lista de todos os serviços existentes no sistema:

service --status-all
kaxi1993
fonte
Errado. Nem forneça a lista de serviços ativados (iniciados na inicialização). Eles mostram todos os serviços conhecidos (alguns dos quais podem estar desabilitados) e se estão em execução no momento (o que não significa necessariamente que são iniciados automaticamente).
Re: Post de Reinier
2

Aqui está o meu oneliner grep -i 'runlevel' /etc/init/* | awk '!/#/ && /start on/ && /2/ {gsub("/"," "); print $0 }' | cut -d ' ' -f4-

Uma saída um pouco mais limpa pode ser alcançada com grep -i 'runlevel' /etc/init/* | awk '/start on/ && /2/ {gsub("/"," "); gsub(":", " ");gsub(".conf"," "); print $3 }'

Agora vamos entrar em detalhes. Os trabalhos iniciados são todos armazenados /etc/init/, certo? Todos os trabalhos têm linhas indicando o nível de execução em que são iniciados. O nível de execução 2 é uma inicialização normal, o nível de execução padrão. Portanto, se grep todas as linhas que dizem runlevele limparmos a saída do grep com awk para corresponder apenas às linhas start one ao nível de execução # 2, obteremos a lista de trabalhos iniciados. O restante é apenas para necessidades de formatação, substitua / nos nomes dos arquivos pelo espaço e corte o caminho desses arquivos, deixando os nomes dos mesmos.

A !/#/parte é abordar as diretivas de início possivelmente comentadas, que eu pessoalmente adicionei manualmente.

Entre outras coisas, é /etc/rc2.donde (se bem entendi) você tem scripts de menor prioridade.

Uma linha bruta para isso é: ls /etc/rc2.d/* | grep S | awk '{sub("S"," "); print $2}

Os scripts nessa pasta que realmente são executados no nível de execução 2 são nomeados começando com S e seguidos pelo número de prioridade. Agora, basicamente, obtemos todos os arquivos começando com S e apenas os listamos com apenas o nome de prioridade (ainda temos que descobrir como limpar isso).

Como muru apontou corretamente nos comentários, também existem /etc/init/*.overridearquivos que podem "... Modificar como um trabalho será executado sem precisar modificar diretamente seu arquivo de configuração" (página de manual do init )

No momento atual, como não tenho muita experiência com esses arquivos, só posso sugerir que você examine esses arquivos .override usando o manual 'grep' '/etc/init/*.override' para listar os serviços que devem ser iniciados manualmente com initctlou servicescomandos.

Sergiy Kolodyazhnyy
fonte
Observe que, devido às dependências do evento, não é possível determinar facilmente se um determinado serviço resultará no início de outros serviços. Há também a pequena questão de .overridearquivos.
Muru
@Serg obrigado. Mas isso lida apenas com coisas novas. Também "ls /etc/rc2.d/* ..." não ajuda muito. Ele mostraria quais serviços podem ter sido iniciados. Mas não mostra quais serviços ainda estão em execução. Eu acho que o ponto principal do meu post não estava claro. Estou procurando: Mas eu gostaria de saber se um serviço que foi iniciado na inicialização ainda está em execução. Não sei se você conhece o Solaris. Lá, eu simplesmente faria "svcs -x" e, se retornar algo, sei que algo não está sendo executado. Eu precisaria de algo assim para o Ubuntu.
Alexander Skwar
Bem, alguém poderia escrever um script ou função bashrc para comparar as saídas do meu liner lá e da lista initctl. Quer que eu publique isso?
Sergiy Kolodyazhnyy 04/04
@Serg bem - se você está oferecendo;)
Alexander Skwar
2

Liste todos os serviços e o respectivo status do nível de execução - estilo chkconfig:

# sysv-rc-conf --list

acpid        2:on       3:on    4:on    5:on
apache-htcac 0:off      1:off   2:off   3:off   4:off   5:off   6:off
apache2      0:off      1:off   2:on    3:on    4:on    5:on    6:off

Edição interativa baseada em texto de todos os listados:

# sysv-rc-conf

l SysV Runlevel Config   -: stop service  =/+: start service  h: help  q: quit qk
x 
x service      1       2       3       4       5       0       6       S 
x ----------------------------------------------------------------------------
x acpid       [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x apache-ht$  [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]
x apache2     [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x
x Use the arrow keys or mouse to move around.      ^n: next pg     ^p: prev pg
x                        space: toggle service on / off

Pode ser necessário instalá-lo, se não houver:

apt install sysv-rc-conf
bzean
fonte