3 votos

¿Cómo utilizar `launchctl print` como sustituto de `launchctl bslist`?

man launchctl ' comenta que:

LEGACY SUBCOMMANDS
     Subcommands from the previous implementation of launchd are generally available,
     though some may be unimplemented. Unimplemented subcommands are documented
     as such.

     bslist [PID | ..] [-j]
         This subcommand is not implemented and has been superseded by the print
         subcommand, which provides much richer information.

al menos a partir de OS X v10.11.x 'El Capitan'. (Es de suponer que también era así en v10.10.x 'Yosemite', ya que esa fue la versión del sistema operativo que incluyó por primera vez ' launchd 2.0", si estoy leyendo/recordando bien mi historia). ¿Qué argumentos, entonces, se pasarían a ' launchctl print ' para obtener una salida como la que ofrece el programa ' bslist ¿el subcomando "W" solía proporcionar? ¿Necesitas filtrarlo (usando grep , sed , awk etc.) para obtener los resultados deseados?

(' launchctl print system ' arroja un montón de datos, pero no tengo claro si eso incluye la misma información que la ' bslist El subcomando ' ha producido en el pasado o, si es así, en qué lugar de la salida del primero podría estar dicha información. Su ' endpoints contiene una lista similar al ejemplo proporcionado en el Listado 1 de la sección "Fundamentos de Mach Bootstrap" de esta vieja y anticuada documentación de Apple sobre 'Daemons y Agentes,' pero no sé si es lo que busco, sobre todo porque contiene un par de columnas adicionales).

6voto

Phill Puntos 126

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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X