macos launchd

macos - ¿Cómo saber la ubicación específica de un archivo launchd.plist?



(5)

¿Es posible conocer la ubicación del archivo .plist que se carga en el comando launchctl?

El nombre de la etiqueta aparece en la lista con "launchctl list" y su contenido se puede ver en "launchctl list LABEL", pero no puedo encontrar la ubicación del archivo .plist.

Sé que se ubicará en / Library / LaunchAgent o ~ / Library / LaunchAgent o algo así, pero no quiero buscar alrededor de las rutas mientras todos los trabajos se enumeran con el comando launchctl.


A partir de macOS 10.12.6 (no estoy seguro acerca de versiones anteriores) es posible invocar: launchctl dumpstate y obtendrá una gran cantidad de información sobre todos los procesos en ejecución.

Busque <LABEL> = { como la primera línea de información correspondiente a ese trabajo

Aquí hay un liner para obtener todos los demonios activos y sus rutas plist:

grep -B 1 -A 1 "active count = 1$" <<< "$(launchctl dumpstate)"


Aquí está el comando para enumerar todos los archivos .plist cargados y sus archivos correspondientes:

find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name ''*.plist'' -exec sh -c ''/usr/libexec/PlistBuddy -c "Print Label" {} && echo {}'' '';'' | grep -wf <(launchctl list | grep -o "/S/+/..*$") -A1

u otra versión:

find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name ''*.plist'' -exec /usr/libexec/PlistBuddy -c "Print Label" {} '';'' -print | grep -wf <(launchctl list | grep -o "/S/+/..*$") -A1

Explicación:

  • find todos los archivos .plist en las siguientes ubicaciones: /System/Library/Launch* /Library/Launch* ~/Library/Launch*
  • Use el comando PlistBuddy para imprimir la Label de todos los archivos .plist encontrados.
  • Utilice el parámetro -print de find para imprimir la ruta a ese archivo.
  • Obtenga otra lista de todos los trabajos cargados en launchd y launchd como archivo de patrón para grep -f .
  • Filtre ambas listas y encuentre los elementos comunes e imprima su etiqueta junto con su ruta ( -A1 ).

Desde la lista de PIDs de la launchctl list , un método es usar el comando lsof para ver todos los archivos cargados del proceso, por ejemplo

launchctl list | grep -o ''^[0-9]/+'' | xargs -n1 lsof -p | grep plist$

Otra forma es ejecutar el comando fs_usage y volver a cargar el archivo .plist , por ejemplo

sudo fs_usage | grep -w launchd | grep -w plist


El nombre del proceso utilizado en la launchctl list se declara en un plist. Si bien la lista debería estar en el lugar mencionado anteriormente, pueden estar en casi cualquier lugar.

Encontré la lista que estaba buscando con ''localizar. Estaba buscando org.postgresql.postgres locate *.plist | grep org.postgresql.postgres locate *.plist | grep org.postgresql.postgres lo redujo a 4 archivos


Este problema surge mucho y, desafortunadamente, la locate y el mdfind no muestran los resultados de los directorios apropiados en mi sistema. Coloqué la siguiente función en mi .bashrc para poder buscar rápidamente los directorios donde launchctl busca archivos plist.

launchctlFind () { LaunchctlPATHS=( / ~/Library/LaunchAgents / /Library/LaunchAgents / /Library/LaunchDaemons / /System/Library/LaunchAgents / /System/Library/LaunchDaemons / ) for curPATH in "${LaunchctlPATHS[@]}" do grep -r "$curPATH" -e "$1" done return 0; }

Tenga en cuenta que esto solo verifica en los directorios donde launchctl busca archivos en el inicio y el inicio de sesión. Es posible que no encuentre todo porque los trabajos pueden ser cargados manualmente por el usuario y / u otros procesos.