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 tty
campo 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 ps
o -U
interruptor ' .
$ 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 --deselect
switch.
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, ps
possui uma -C
opção que nos permite selecionar pelo nome do comando. Acabamos de receber nossa lista de comandos, então vamos injetá-la na ps
linha de comando. Observe que eu estou usando --deselect
depois 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 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 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 ^?
network-manager
nãoNetworkManager
.