Como listar todos os daemons em execução?

23

Do meu pergunta , ficou claro que não posso decidir facilmente os recursos de um daemon. Li em artigos diferentes e em fóruns diferentes que o comando service --status-all pode ser usado para listar todos os daemons em meu sistema. Mas eu não acho que o comando esteja listando todos os daemons porque NetworkManager , um daemon que está atualmente em execução no meu sistema Ubuntu 14.04 , não está listado pelo comando. Existe algum comando para listar os daemons em execução ou há alguma maneira de encontrar os daemons do próprio filesystem ?

    
por Jackzz 22.12.2014 / 11:39

2 respostas

42

A noção de daemon está anexada a processos , não arquivos . Por esse motivo, não há sentido em "encontrar daemons no sistema de arquivos". Apenas para tornar 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 , podemos encontrar daemons em execução procurando por processos que rodam sem um terminal de controle anexado a eles . Isso pode ser feito facilmente com ps :

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

O campo de saída tty contém "?" quando o processo não tem terminal de controle.

O grande problema aqui vem quando o sistema executa um ambiente gráfico. Como os programas GUI (ou seja, o Chromium) não estão conectados a um terminal, eles também aparecem na saída. Em um sistema padrão, em que o root não executa programas gráficos, você poderia simplesmente restringir a lista anterior aos processos do root. Isso pode ser conseguido usando ps ' -U switch.

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

No entanto, dois problemas surgem aqui:

  • Se o root estiver executando programas gráficos, eles serão exibidos.
  • Daemons em execução sem privilégios de root não. Note que os daemons que começam no tempo de boot são geralmente executados como root.

Basicamente, gostaríamos de exibir todos os programas sem um terminal de controle, mas não programas GUI . Felizmente para nós, existe um programa para listar os processos da GUI: xlsclients ! Esta resposta do slm nos diz como usá-la para listar todos os programas GUI, mas teremos que reverter isso , uma vez que queremos excluí-los. Isso pode ser feito usando a opção --deselect .

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

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

Agora, ps tem uma opção -C que nos permite selecionar pelo nome do comando. Acabamos de receber nossa lista de comandos, então vamos injetar na linha de comando ps . Observe que estou usando --deselect para reverter minha seleção.

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

Agora, temos uma lista de todos os processos não-GUI. Não nos esqueçamos da nossa regra "no TTY attached". Para isso, adicionarei -o tty,args à linha anterior para gerar o tty de cada processo (e sua linha de comando completa):

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

O% final grep captura todas as linhas que começam com "?", ou seja, todos os processos sem um controle tty. E ai você vai! Esta linha final dá a você todos os processos não-GUI em execução sem um terminal de controle. Observe que você ainda pode melhorar, por exemplo, com excluindo encadeamentos 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 ^?
    
por 22.12.2014 / 13:21
0

Eu escrevi para o "antigo" sysv initd, você tem que verificar se ele está trabalhando em sua distro.

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?

Procura seus nomes no diretório

/var/lock/subsys

Então você pode

get the names list from there

scan all the running processes and check if the name is inside the list: bingo !

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

/proc

Se o nome for 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 e pegue a primeira linha, começa com "Nome:"

Veja

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 do meu celular ...)

    
por 30.08.2018 / 21:29