Como listar todos os daemons em execução?

32

A partir da minha pergunta , ficou claro que não posso decidir facilmente os recursos de um daemon. Li em artigos diferentes e em fóruns diferentes que service --status-allcomandos podem ser usados ​​para listar todos os daemons no meu sistema. Mas não acho que o comando esteja listando todos os daemons porque NetworkManager, um daemon atualmente em execução no meu Ubuntu 14.04sistema, não está listado pelo comando. Existe algum comando para listar os daemons em execução ou existe alguma maneira de encontrar os daemons por filesystemsi mesmo?

Jackzz
fonte
Tem certeza de que não está listado? Como você está checando? Eu posso ver isso no meu Debian. Observe que o nome é network-managernão NetworkManager.
terdon
Sim. Tenho certeza. Nada relacionado ao termo rede está listado. Também lista o anacronque é mencionado como não um daemon em seu script init.
Jackzz
Anacron não ser um daemon é mais uma questão de semântica, porque não é executada constantemente. Ele ainda é executado como um serviço, o que você normalmente chama de daemons. Por favor edite sua pergunta e i) diga-nos qual Ubuntu você está executando e ii) o que exatamente você quer dizer com "daemon". Qual é o seu objetivo final aqui?
terdon
Suponho que qualquer serviço executado em segundo plano seja um daemon. Eu mencionei anacronporque foi dito /etc/init.d/anacronque não é um daemon. Meu objetivo é escrever um C++programa para listar todos os daemons em execução no meu sistema. Para isso, preciso saber quais arquivos analisar para obter os detalhes.
Jackzz
1
Bem, se você definir daemons como serviços, service --status-allé disso que precisa. O Ubuntu parece tratar o NetworkManager de maneira diferente. Eu recebo ambos networkinge network-managerna saída do services --status-allDebian, mas apenas networkingno Ubuntu. Eu acho que você precisa definir o que exatamente você quer dizer com "daemon".
terdon

Respostas:

52

A noção de daemon é anexada a processos , não a arquivos . Por esse motivo, não faz sentido "encontrar daemons no sistema de arquivos". Apenas para deixar a noção um pouco mais clara: um programa é um arquivo executável (visível na saída de ls); um processo é uma instância desse programa (visível na saída de ps).

Agora, se usarmos as informações que eu forneci em minha resposta , poderemos encontrar daemons em execução pesquisando processos executados sem um terminal de controle conectado a eles . Isso pode ser feito facilmente com ps:

$ ps -eo 'tty,pid,comm' | grep ^?

O ttycampo de saída contém "?" quando o processo não possui terminal de controle.

O grande problema ocorre quando o sistema executa um ambiente gráfico. Como os programas da GUI (por exemplo, Chromium) não estão conectados a um terminal, eles também aparecem na saída. Em um sistema padrão, onde o root não executa programas gráficos, você pode simplesmente restringir a lista anterior aos processos do root. Isso pode ser conseguido usando pso -Uinterruptor ' .

$ ps -U0 -o 'tty,pid,comm' | grep ^?

No entanto, dois problemas surgem aqui:

  • Se o root estiver executando programas gráficos, eles aparecerão.
  • Daemons rodando sem privilégios de root não. Observe que os daemons iniciados no momento da inicialização geralmente estão em execução como root.

Basicamente, gostaríamos de exibir todos os programas sem um terminal de controle, mas não os programas da GUI . Felizmente para nós, não é um programa para processos lista GUI: xlsclients! Esta resposta do slm nos diz como usá-lo para listar todos os programas da GUI, mas teremos que revertê-lo, pois queremos excluí-los. Isso pode ser feito usando o --deselectswitch.

Primeiro, criaremos uma lista de todos os programas GUI para os quais temos processos em execução. A partir da resposta que acabei de vincular, isso é feito usando ...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

Agora, pspossui uma -Copção que nos permite selecionar pelo nome do comando. Acabamos de receber nossa lista de comandos, então vamos injetá-la na pslinha de comando. Observe que eu estou usando --deselectdepois para reverter minha seleção.

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

Agora, temos uma lista de todos os processos que não são da GUI. Não vamos esquecer nossa regra de "não anexar TTY". Para isso, adicionarei -o tty,argsà linha anterior para gerar o resultado ttyde cada processo (e sua linha de comando completa):

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

O final grepcaptura todas as linhas que começam com "?", Ou seja, todos os processos sem um controle tty. E lá vai você! Essa linha final fornece todos os processos que não são da GUI em execução sem um terminal de controle. Observe que você ainda pode melhorá-lo, por exemplo, excluindo threads do kernel (que não são processos) ...

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

... ou adicionando algumas colunas de informações para você ler:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
John WH Smith
fonte
O linux mantém muitas informações em um sistema de arquivos virtual, procfs. então é possível "encontrar daemons no sistema de arquivos" !!!
Massimo
0

Escrevi para o "antigo" sysv initd, você deve verificar se está funcionando na sua distribuição.

Bons demônios têm scripts de inicialização bem escritos em / etc / initd

Ao alterar o nível de execução, como o init conhece os daemons em execução?

Ele procura seus nomes no diretório

/ var / lock / subsys

Então você pode

obtenha a lista de nomes a partir daí

verifique todos os processos em execução e verifique se o nome está dentro da lista: bingo!

Para verificar todos os processos: liste todos os subdiretórios em

/ proc

Se o nome tiver dígitos, é o pid de um processo em execução.

Por exemplo, o status do processo com o pid 1234 é este arquivo

/ proc / 1234 / status

Abra-o e obtenha a primeira linha, começa com "Nome:"

Vejo

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(desculpe pela formatação desagradável, estou escrevendo no meu celular ...)

Massimo
fonte