2 votos

MacOS `launchctl load` problema con <ProgramArguments>

Tengo poco entendido por qué mi ~/Library/LaunchAgents/com.user.loginscript.plist no funciona.

Aquí está el código que NO funciona dentro de mi plist :

<key>ProgramArguments</key>
<array>
<string>switchaudiosource</string>
<string>-s</string>
<string>MacBook Pro Speakers</string>
</array>

y aquí está el código de trabajo dentro de mi plist :

<key>Program</key>
<string>/Users/zlapik/bin/setup_output_sound.sh</string>

ya que dentro /Users/zlapik/bin/setup_output_sound.sh es sólo:

#!/bin/bash
switchaudiosource -s "MacBook Pro Speakers"

¿Podría alguien explicar la razón por la que estos sucediendo, aunque LaunchControl ¿el programa no se queja de nada?

Si sirve de ayuda también incluyo el archivo de la lista completa:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
          <key>PATH</key>
          <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/zlapik/bin</string>
        </dict>
        <key>Label</key>
        <string>com.user.loginscript</string>
        <!-- <key>Program</key> -->
        <!-- <string>/Users/zlapik/bin/setup_output_sound.sh</string> -->
        <key>ProgramArguments</key>
        <array>
            <string>switchaudiosource</string>
            <string>-s</string>
            <string>MacBook Pro Speakers</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
        <key>LaunchOnlyOnce</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/tmp/com.user.loginscript.stdout</string>
        <key>StandardErrorPath</key>
        <string>/tmp/com.user.loginscript.stderr</string>
        <key>UserName</key>
        <string>admin</string>
        <key>GroupName</key>
        <string>staff</string>
        <key>InitGroups</key>
        <true/>
    </dict>
</plist>

Editar: switchaudiosource es una aplicación cli instalada a través de brew install switchaudio-osx .

2voto

Martin R Puntos 181

Desde man launchd.plist :

Program <string>
This key maps to the first argument of execv(3) and indicates the absolute
path to the executable for the job. If this key is missing, then the first
element of the array of strings provided to the ProgramArguments will be
used instead. This key is required in the absence of the ProgramArguments
key.

ProgramArguments <array of strings>
This key maps to the second argument of execvp(3) and specifies the
argument vector to be passed to the job when a process is spawned. This key
is required in the absence of the Program key.  IMPORTANT: Many people are
confused by this key. Please read execvp(3) very carefully!

NOTE: The Program key must be an absolute path. Previous versions of
launchd did not enforce this requirement but failed to run the job. In the
absence of the Program key, the first element of the ProgramArguments array
may be either an absolute path, or a relative path which is resolved using
_PATH_STDPATH.

Su plist especifica ProgramArguments para que el primer elemento de esa matriz se utilice como ruta de acceso al ejecutable. Como no es una ruta absoluta, se resuelve contra _PATH_STDPATH que se define en <paths.h> como

/* All standard utilities path. */
#define _PATH_STDPATH   "/usr/bin:/bin:/usr/sbin:/sbin"

Tenga en cuenta que esta "ruta estándar" no incluye "/usr/local/bin", donde reside el programa switchaudiosource. Por eso no funciona con la primera versión de su plist.

Especificando EnvironmentVariables en el plist no ayuda: Esas variables de entorno se establecen para el trabajo en ejecución, pero no se utilizan para localizar el ejecutable.

Por otro lado, si el inicio de sesión scripts ejecuta el shell scripts, entonces el shell analiza archivos de configuración adicionales, en particular /etc/paths que contiene

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Así que "/usr/local/bin" se añade a la ruta de búsqueda, y el programa switchaudiosource se encuentra en ese directorio.

Adenda: launchd escribe mensajes de diagnóstico en

/var/log/com.apple.xpc.launchd/launchd.log

(esa es la ruta en MacOS 12 Monterey), también puedes encontrarlo en la aplicación Console (elige "Log Reports" en la barra lateral izquierda, y luego "launchd.log"). Si cargas el plist manualmente con

launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist

entonces debería ver un mensaje de error

<Error>: Service could not initialize: posix_spawn(switchaudiosource) error: 0x2: No such file or directory

en el archivo de registro si el ejecutable no pudo ser localizado.

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