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-all
comando 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.04
sistema, 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 filesystem
mismo?
32
network-manager
, noNetworkManager
.anacron
que se menciona como no un demonio en su script de inicio.anacron
porque se dijo/etc/init.d/anacron
que no es un demonio. Mi objetivo es escribir unC++
programa para enumerar todos los demonios que se ejecutan en mi sistema. Para eso necesito saber qué archivos analizar para obtener los detalles.service --status-all
es lo que necesita. Ubuntu parece tratar a NetworkManager de manera diferente. Obtengo ambosnetworking
ynetwork-manager
en la salida deservices --status-all
Debian pero solonetworking
en Ubuntu. Creo que necesitas definir qué quieres decir exactamente con "demonio".Respuestas:
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 deps
).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
: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.Sin embargo, aquí surgen dos problemas:
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 ...
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 laps
línea de comandos. Tenga en cuenta que estoy usando--deselect
después para revertir mi selección.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 resultadotty
de cada proceso (y su línea de comando completa):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) ...... o agregando algunas columnas de información para que las lea:
fuente
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.
Así que puedes
Para escanear todos los procesos: enumere cada subdirectorio en
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
Ábralo y obtenga la primera línea, comienza con "Nombre:"
Ver
(perdón por el formato desagradable, estoy escribiendo desde mi teléfono celular ...)
fuente