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 laLabel
de todos los archivos.plist
encontrados. - Utilice el parámetro
-print
defind
para imprimir la ruta a ese archivo. - Obtenga otra lista de todos los trabajos cargados en
launchd
ylaunchd
como archivo de patrón paragrep -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.