¿Cómo enumerar todos los demonios en ejecución?

32

Desde mi pregunta , estaba claro que no puedo decidir fácilmente las características de un demonio. He leído en diferentes artículos y en diferentes foros que el service --status-allcomando se puede utilizar para enumerar todos los demonios en mi sistema. Pero no creo que el comando esté enumerando todos los demonios porque NetworkManager, un comando que se está ejecutando actualmente en mi Ubuntu 14.04sistema, no está listado por el comando. ¿Hay algún comando para enumerar los demonios en ejecución o hay alguna forma de encontrar los demonios desde el filesystemmismo?

Jackzz
fuente
¿Estás seguro de que no está en la lista? ¿Cómo te va? Puedo verlo en mi Debian. Tenga en cuenta que el nombre es network-manager, no NetworkManager.
terdon
Sí. Estoy seguro. No se enumera nada relacionado con el término red. También enumera lo anacronque se menciona como no un demonio en su script de inicio.
Jackzz
Anacron no es un demonio es más una cuestión de semántica porque no se ejecuta constantemente. Todavía se ejecuta como un servicio que es lo que normalmente se conoce como demonios. Por favor, editar su pregunta y i) nosotros, que Ubuntu está ejecutando contar y ii) ¿qué quiere decir con "demonio". ¿Cuál es tu objetivo final aquí?
terdon
Supongo que cualquier servicio que se ejecute en segundo plano es un demonio. Mencioné anacronporque se dijo /etc/init.d/anacronque no es un demonio. Mi objetivo es escribir un C++programa para enumerar todos los demonios que se ejecutan en mi sistema. Para eso necesito saber qué archivos analizar para obtener los detalles.
Jackzz
1
Bueno, si define demonios como servicios, service --status-alles lo que necesita. Ubuntu parece tratar a NetworkManager de manera diferente. Obtengo ambos networkingy network-manageren la salida de services --status-allDebian pero solo networkingen Ubuntu. Creo que necesitas definir qué quieres decir exactamente con "demonio".
terdon

Respuestas:

52

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 ttycampo 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' -Uswitch.

$ 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 --deselectinterruptor.

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, pstiene un -Cinterruptor que nos permite seleccionar por nombre de comando. Acabamos de recibir nuestra lista de comandos, así que vamos a inyectarla en la pslínea de comandos. Tenga en cuenta que estoy usando --deselectdespué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,argsa la línea anterior para generar el resultado ttyde 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 grepcaptura 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 ^?
John WH Smith
fuente
Linux mantiene mucha información en un sistema de archivos virtual, procfs. ¡¡¡entonces es factible "encontrar demonios en el sistema de archivos" !!!
Massimo
0

Escribí para el "viejo" init de sysv, tienes que comprobar si está funcionando en tu distribución.

Los demonios buenos tienen scripts de inicio bien escritos en / etc / initd

Al cambiar el nivel de ejecución, ¿cómo sabe init los demonios en ejecución?

Busca sus nombres en el directorio.

/ var / lock / subsys

Así que puedes

obtener la lista de nombres desde allí

escanee todos los procesos en ejecución y verifique si el nombre está dentro de la lista: ¡bingo!

Para escanear todos los procesos: enumere cada subdirectorio en

/ proc

Si su nombre es dígitos, es el pid de un proceso en ejecución.

Por ejemplo, el estado del proceso con pid 1234 es este archivo

/ proc / 1234 / status

Ábralo y obtenga la primera línea, comienza con "Nombre:"

Ver

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

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

(perdón por el formato desagradable, estoy escribiendo desde mi teléfono celular ...)

Massimo
fuente