La noción de demonio está unida a procesos , no a archivos . Por esta razón, no tiene sentido "encontrar demonios en el sistema de archivos". Solo para aclarar un poco la idea: un programa es un archivo ejecutable (visible en la salida de ls
); un proceso es una instancia de ese programa (visible en la salida de ps
).
Ahora, si utilizamos la información que proporcioné en mi respuesta , podríamos encontrar demonios en ejecución buscando procesos que se ejecuten sin un terminal de control conectado a ellos . Esto se puede hacer fácilmente con ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
El tty
campo de salida contiene "?" cuando el proceso no tiene terminal de control.
El gran problema aquí viene cuando su sistema ejecuta un entorno gráfico. Como los programas GUI (es decir, Chromium) no están conectados a un terminal, también aparecen en la salida. En un sistema estándar, donde root no ejecuta programas gráficos, simplemente podría restringir la lista anterior a los procesos de root. Esto se puede lograr usando ps
' -U
switch.
$ ps -U0 -o 'tty,pid,comm' | grep ^?
Sin embargo, aquí surgen dos problemas:
- Si root está ejecutando programas gráficos, aparecerán.
- Los demonios que se ejecutan sin privilegios de root no lo harán. Tenga en cuenta que los demonios que comienzan en el momento del arranque generalmente se ejecutan como root.
Básicamente, nos gustaría mostrar todos los programas sin un terminal de control, pero no los programas GUI . Por suerte para nosotros, no es un programa para los procesos de la lista de GUI: xlsclients
! Esta respuesta de slm nos dice cómo usarlo para enumerar todos los programas GUI, pero tendremos que revertirlo, ya que queremos excluirlos. Esto se puede hacer usando el --deselect
interruptor.
Primero, crearemos una lista de todos los programas GUI para los que tenemos procesos en ejecución. De la respuesta que acabo de vincular, esto se hace usando ...
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
Ahora, ps
tiene un -C
interruptor que nos permite seleccionar por nombre de comando. Acabamos de recibir nuestra lista de comandos, así que vamos a inyectarla en la ps
línea de comandos. Tenga en cuenta que estoy usando --deselect
después para revertir mi selección.
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
Ahora, tenemos una lista de todos los procesos no GUI. No olvidemos nuestra regla de "no TTY adjunto". Para esto, agregaré -o tty,args
a la línea anterior para generar el resultado tty
de cada proceso (y su línea de comando completa):
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
El final grep
captura todas las líneas que comienzan con "?", Es decir, todos los procesos sin un control tty. Y ahí tienes! Esta línea final le brinda todos los procesos que no son de GUI que se ejecutan sin un terminal de control. Tenga en cuenta que aún podría mejorarlo, por ejemplo, excluyendo hilos del núcleo (que no son procesos) ...
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
... o agregando algunas columnas de información para que las lea:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
network-manager
, noNetworkManager
.