mpd tartamudea cuando se ejecuta bajo launchd

Fondo

Como adicto a las terminales, comencé a experimentar con una combinación de mpd (Music Player Daemon) y un reproductor, ncmpcpp (NCurses Media Player Client C++).

Los instalé a través de Homebrew, un simple archivo brew install mpd ncmpcpp. Un poco de configuración más tarde, y las aplicaciones funcionan bastante bien. El efecto es bastante impresionante:ncmpcpp jugando algunas cosas al azar

El problema con el que me encuentro es cuando quiero que se ejecute mpdautomáticamente en lugar de que se inicie en mi terminal. Viene con un launchdplist, así que lo instalé y parece funcionar. El problema es que lo que sea que esté reproduciendo, ya sea un MP3, la transmisión de audio desde un servidor, o lo que sea, el audio tartamudea cada 5 segundos.

Esto no sucede en absoluto cuando mpdse invoca directamente desde la línea de comandos, solo cuando se activa a través de launchd.

Así es como se ve la plist:

<!--homebrew.mxcl.mpd.plist-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>homebrew.mxcl.mpd</string>
    <key>ProcessType</key>
    <string>Interactive</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/mpd/bin/mpd</string>
        <string>--no-daemon</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
</dict>

Lo ProcessType interactiveagregué yo en un intento de forzar a launchd a darle al demonio una mayor prioridad, sin ningún efecto.

¿Depuración?

Si seguimos dtrussel proceso, hay una gran cantidad de gettimeofdaymensajes idénticos relacionados con cada tartamudeo. Se parece a esto:

gettimeofday(0x10A03FD40, 0x0, 0x1000)       = 1428698761 0

Cosas que ya eliminé

  • CPU/E/S de disco

El sistema es relativamente silencioso: durante los tartamudeos, mpd ni siquiera está entre los primeros 25 en uso de memoria o CPU, y la carga está muy por debajo de 1.0

  • Entorno incorrecto que provoca que se carguen ajustes de configuración incorrectos

Mi configuración de mpd es la que se está cargando ~/.mpdconf, igual que cuando la ejecuto a mano.

Esto parece ser un síntoma de la forma en que launchd elige manejar el proceso.

La última pregunta

¿Por qué el daemon se comporta tan mal cuando se ejecuta bajo launchd, pero no cuando se ejecuta a través de la terminal?

Pregunta extra:

¿Qué pasa con la forma en que launchd inicia los procesos que podría estar haciendo que este comportamiento se manifieste?

Respuestas (1)

Tuve un problema similar y Google me llevó a este hilo. Ahora tengo una solución al problema si alguien más encuentra esto.

Simplemente elimine la --no-daemonlínea.

Esto parece que funciona bien:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>homebrew.mxcl.mpd</string>
    <key>WorkingDirectory</key>
    <string>/usr/local</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/opt/mpd/bin/mpd</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>
Tuve que hacer otra cosa además de esto, y fue apagar la salida FIFO (usada para visualización). Hay un error abierto informado en MPD que indica que el complemento de salida "osx" tiene este problema, no se mantiene y es poco probable que se solucione
bugs.musicpd.org/view.php?id=4316 es el error mencionado en el rastreador de errores de MPD.
Ejecutar mpdy mpd --no-daemondesde la línea de comandos funciona perfectamente bien. Ambas opciones resultan en tartamudeos cuando se ejecutan a través de launchd( brew servicesen realidad).