Respuesta corta
Utilizar:
bash -c "if [ \$(id -u) -eq 0 ]; then domain=system; else domain=\"user/\$(id -u)\"; fi; launchctl print \$domain | sed -e '1,/endpoints = {/d' -e '/}/,\$d' -e 's/.* \([A|D]\)\( *\)\(.*\)/\1 \3/'"
Si prefiere un script, cree un archivo, por ejemplo /usr/local/bin/bslist
con estos contenidos:
#!/bin/bash
if [ $(id -u) -eq 0 ]; then
domain=system
else
domain="user/$(id -u)"
fi
launchctl print $domain | sed -e '1,/endpoints = {/d' -e '/}/,$d' -e 's/.* \([A|D]\)\( *\)\(.*\)/\1 \3/';
y hacerla ejecutable: chmod a+x /usr/local/bin/bslist
. (Ver el final de este post para una explicación de cómo funciona el script).
Tenga en cuenta que tanto el comando como el script anteriores son totalmente compatibles con sudo
:
-
Para obtener la salida equivalente a la ejecución de sudo launchctl bslist
Simplemente, añada sudo
:
sudo bash -c "if [ \$(id -u) -eq 0 ]; then domain=system; else domain=\"user/\$(id -u)\"; fi; launchctl print \$domain | sed -e '1,/endpoints = {/d' -e '/}/,\$d' -e 's/.* \([A|D]\)\( *\)\(.*\)/\1 \3/'"
sudo /user/local/bin/bslist
.
-
Para obtener la salida para un usuario diferente <user>
es decir, la salida sudo -u <user> launchctl bslist
produciría, preagregaría sudo -u <user>
en su lugar.
(Probado en MacOS 10.15 "Catalina" y OS X 10.10 "Yosemite").
Respuesta larga
Los que ya no están bslist
bslist
fue eliminado con OS X 10.10 "Yosemite". Según Página man de launchctl en OS X 10.9 Mavericks , bslist
(...) imprime los servicios de arranque de Mach y sus respectivos estados. Aunque el espacio de nombres parece plano, en realidad es jerárquico, lo que permite que ciertos servicios sólo estén disponibles para un subconjunto de procesos. Los tres estados en los que puede estar un servicio son activo ("A"), inactivo ("I") y bajo demanda ("D").
La salida típica es:
A com.apple.finder.ServiceProvider
D com.apple.udb.system-push
D com.apple.systemprofiler
A com.apple.systemuiserver.ServiceProvider
A com.apple.dock.server
[...]
donde:
- la primera columna es el estado del servicio de arranque (
A
para "Activo" y D
"A la carta")
- la segunda columna es el nombre del servicio de arranque
print
el nuevo chico de la ciudad
Apple reemplazó bslist
con un subcomando mejorado: print
.
¿Por qué mejorar? Como bien se explica aquí Los servicios de arranque están organizados en un espacio de nombres jerárquico. Mientras que bslist
oculta esta complejidad al usuario haciendo las siguientes suposiciones:
- Cuando se ejecuta como Root (ya sea a través de un shell Root o
sudo
), bslist
da salida al dominio de todo el sistema.
- Cuando se ejecuta desde un usuario sin privilegios el objetivo se supone que es el dominio por usuario para ese usuario actual.
print
adopta otro enfoque: da al usuario un control más fino sobre la salida aceptando el dominio deseado como argumento (véase el página man de launchctl para más detalles).
Haciendo print
se comportan como bslist
Por suerte, después de correr bslist
en OS X 10.9 "Mavericks" y print
en OS X 10.10 "Yosemite" varias veces y comparando la salida, puedo confirmar que toda la información proporcionada por bslist
está contenida en print
:
- El dominio de todo el sistema impreso por
bslist
cuando se ejecuta como Root can es proporcionada por el system
en la matriz de puntos finales.
- El dominio por usuario es proporcionado por
print
con el user/<UID>
también en la matriz de puntos finales.
Se proporcionan los comandos exactos por encima de en la sección de respuestas cortas de este post, aquí vuelvo a revisar el script (con comentarios) para entender mejor lo que hace:
#!/bin/bash
# Compare the user UID (from command "id -u") with 0
if [ $(id -u) -eq 0 ]; then
# If the user is root (that is, the user UID is 0), request
# the "system" domain
domain=system
else
# Otherwise request the user domain
domain="user/$(id -u)"
fi
# Run launchctl
launchctl print $domain |\
# Remove the output before "endpoints = {"
sed -e '1,/endpoints = {/d' \
# Remove the output after "}"
-e '/}/,$d' \
# Remove the port information and format the output as bslist
-e 's/.* \([A|D]\)\( *\)\(.*\)/\1 \3/';
Unas palabras sobre los servicios de arranque
Esta respuesta trata de los servicios de arranque, pero, ¿qué son?
MacOS utiliza un núcleo híbrido, llamado XNU que combina el kernel Mach desarrollado en la Universidad Carnegie Mellon con componentes de FreeBSD y una API C++ para escribir controladores llamada IOKit.
La comunicación entre procesos (IPC) desempeña un papel importante en el componente Mach del núcleo. La implementación de Mach de IPC se basa en la noción de "puertos".
En Mach IPC, los puertos son algo similar a los puertos TCP y UDP: de la misma manera que un proceso requiere el puerto TCP/UDP de un recurso en la red para poder comunicarse con él, los procesos que se comunican a través de Mach IPC necesitan conocer el puerto del servicio deseado. Esta información es proporcionada por el servidor de arranque que es una de las funciones del launchd
proceso.
Así que, en esta analogía demasiado simplificada, el servidor de arranque desempeña un papel más o menos equivalente a /etc/services
.
Al igual que con el /etc/services
el servidor bootstrap mantiene una lista de puertos y nombres. Puede obtener una lista de ellos con launchctl print
Sólo hay que buscar la sección de la matriz del punto final, por ejemplo:
puerto: 0x3e607
nombre: com.apple.dock.server
Estirando la analogía, la diferencia entre el archivo de servicios y Mach IPC es que, mientras /etc/services
es estática, la lista de puertos y nombres que mantiene el servidor de arranque es dinámica, ya que los servicios pueden solicitar ser añadidos a ella.
Y eso nos lleva a la pregunta original: Los servicios de arranque son simplemente servicios registrados en el servidor de arranque .
Referencias
Si estás interesado en el proceso de lanzamiento de MacOS, Mach IPC, launchd
y su interior, puede encontrar estas referencias útiles:
Ver Fundamentos de Mach Bootstrap y Mensajería Mach y comunicación entre procesos Mach (IPC) para más información sobre los fundamentos del bootstrap y el IPC.
Ver Visión general de la arquitectura del núcleo para obtener más información sobre la arquitectura del núcleo de MacOS.
Ver Visión general de Mach para obtener una visión general del componente Mach del núcleo de MacOS.
Ver Mac OS X para los geeks de Unix y El Alfa y el Omega - launchd para una visión general del proceso de arranque en MacOS.
Ver SINTAXIS DE LAUNCHCTL 2.0 para un debate sobre los cambios en la launchctl
sintaxis.
Ver Mach Message y Bootstrap Server en OS X para obtener una visión general de la mensajería Mach y del servidor de arranque.
Ver el código fuente del subcomando bslist (busque bslist_cmd
) para obtener información sobre launchctl
. Puede descargar launchd
tarballs de aquí .
Ver MacOS IPC Man in the Middle para una presentación sobre los fallos de implementación de Mach IPC.