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:
El problema con el que me encuentro es cuando quiero que se ejecute mpd
automáticamente en lugar de que se inicie en mi terminal. Viene con un launchd
plist, 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 mpd
se invoca directamente desde la línea de comandos, solo cuando se activa a través de launchd.
<!--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 interactive
agregué yo en un intento de forzar a launchd a darle al demonio una mayor prioridad, sin ningún efecto.
Si seguimos dtruss
el proceso, hay una gran cantidad de gettimeofday
mensajes idénticos relacionados con cada tartamudeo. Se parece a esto:
gettimeofday(0x10A03FD40, 0x0, 0x1000) = 1428698761 0
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
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.
¿Por qué el daemon se comporta tan mal cuando se ejecuta bajo launchd, pero no cuando se ejecuta a través de la terminal?
¿Qué pasa con la forma en que launchd inicia los procesos que podría estar haciendo que este comportamiento se manifieste?
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-daemon
lí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>
mpd
y mpd --no-daemon
desde la línea de comandos funciona perfectamente bien. Ambas opciones resultan en tartamudeos cuando se ejecutan a través de launchd
( brew services
en realidad).
shrx