Ejecutando un comando cada vez que Mac arranca con launchctl / plist

5

Necesito ejecutar el comando nohup nice synergys -f --config ~/bin/conf/synergy.conf & cada vez que la computadora se inicie.

Como está escrito en esta publicación , se me ocurrió el siguiente código Plist.

<?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>Label</key>
    <string>synergy</string>
    <key>ProgramArguments</key>
    <array>
        <string>nohup nice /usr/bin/synergys -f --config /Users/USER/bin/conf/synergy.conf &</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>LaunchOnlyOnce</key>
    <true/>
</dict>
</plist>

Y, ejecutó este comando.

launchctl load ./synergy.plist 

Sin embargo, recibí este mensaje de error.

launchctl: no plist was returned for: ./synergy.plist
launchctl: no plist was returned for: ./synergy.plist
nothing found to load

¿Qué pasa con mi plist? ¿O mi comando launchctrl es incorrecto en las opciones?

    
pregunta prosseek 10.02.2011 - 22:59

1 respuesta

12

El problema inmediato es que su archivo .plist no está formateado correctamente: el contenido de <string>...</string> debe estar codificado con entidades HTML, es decir, & debe codificarse como &amp; (nota: puede verificar el formato de los archivos .plist con plutil -lint filename.plist ). Pero hay otros cambios que deben hacerse ...

Iniciar programas con launchd es bastante diferente a iniciarlos desde un shell. La mayor diferencia es que desde el shell, desea que el programa pase al fondo y se ejecute independientemente del shell, por lo que lo ajusta en nohup ... & . Con launchd, en realidad es mejor que el programa se mantenga en "primer plano" para que launchd pueda vigilarlo.

Además, los elementos de ProgramArguments no serán analizados por un shell, por lo que la lista del comando y sus argumentos con espacios entre ellos no funciona. Convierta cada argumento en un elemento separado de la matriz.

Aquí está mi puñalada en una lista de sinergias. No he probado esto, por lo que puede necesitar un poco de ajuste para que funcione correctamente (vea las notas a continuación):

<?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>Label</key>
    <string>local.synergy</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/synergys</string>
        <string>-f</string>
        <string>--config</string>
        <string>/Users/USER/bin/conf/synergy.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Nice</key>
    <integer>10</integer>
    <key>KeepAlive</key>
    <false/>
    <key>AbandonProcessGroup</key>
    <true/>
</dict>
</plist>

Las dos últimas teclas anteriores tratan sobre cómo debería reaccionar launchd si / cuando el programa Synergys finaliza. Por defecto, mata a los subprocesos supervivientes y lanza una nueva instancia; Estas dos teclas suprimen ambas partes, que pueden o no ser lo que quieres. Además, una cosa que esto no hace que su versión con nohup hace es redirigir stdin y stdout a nohup.out (en caso de que el terminal desaparezca); En su lugar, IIRC launchd registra las cosas que se envían a ellos. Si las sinergias están en el hábito de enviar resultados, es posible que desee agregar algo como esto a la lista .ppl:

    <key>StandardOutPath</key>
    <string>/dev/null</string>
    <key>StandardErrorPath</key>
    <string>/dev/null</string>

También, como dijo mankoff, deberías poner esto en ~ / Library / LaunchAgents para que se cargue automáticamente cada vez que inicies sesión. Ah, y probablemente debas agregar un prefijo local. al nombre del archivo (como hice con la etiqueta) para cumplir con la convención de nomenclatura de DNS inversa.

    
respondido por el Gordon Davisson 11.02.2011 - 02:43

Lea otras preguntas en las etiquetas