Fondo
Como adicto a la terminal, comencé a jugar con una combinación de mpd (Music Player Daemon) y un jugador, ncmpcpp (NCurses Media Player Client C ++).
Los instalé a través de Homebrew, un simple brew install mpd ncmpcpp
. Un poco de configuración más tarde, y las aplicaciones se están ejecutando bastante bien. El efecto es en realidad bastante impresionante:
Elproblemaqueencuentroescuandoquieroejecutarmpd
automáticamenteenlugardetenerloenmiterminal.Vieneconunlaunchd
plist,asíqueinstaloeso,yparecequefunciona.Elproblemaesquesealoqueseaqueestéreproduciendo,yaseaunMP3,transmisióndeaudiodesdeunservidor,oloquesea,elaudiotartamudeacada5segundos
Estonoocurreabsolutamentecuandoseinvocampd
directamentedesdelalíneadecomandos,solocuandosedisparamediantelaunchd.
Asíescomoseveelplist:
<!--homebrew.mxcl.mpd.plist--><?xmlversion="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>
El ProcessType interactive
fue agregado por mí en un intento de forzar a launchd para darle mayor prioridad al daemon, sin ningún efecto.
¿Depurando?
Si dtruss
del proceso, hay una gran explosión de mensajes gettimeofday
idénticos correlacionados con cada tartamudeo. Se parece a esto:
gettimeofday(0x10A03FD40, 0x0, 0x1000) = 1428698761 0
Cosas que ya he eliminado
- CPU / Disk IO
El sistema es relativamente silencioso: durante los tartamudos, mpd ni siquiera se encuentra entre los 25 primeros para el uso de la memoria o la CPU, y la carga está muy por debajo de 1.0
- El entorno incorrecto hace que se carguen las configuraciones de configuración incorrectas
Mi configuración de mpd es la que se carga desde ~/.mpdconf
, igual que cuando lo 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 demonio es tan malo cuando se ejecuta en launchd, pero no cuando se ejecuta a través de terminal?
Pregunta de bonificación:
¿Qué pasa con la forma en que Launchd da inicio a los procesos podría estar manifestando este comportamiento?