5 votos

Ejecutar un comando cada vez que Mac botas launchctl/plist

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

Como está escrito en este post, se me ocurrió la siguiente plist código.

<?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, tengo este mensaje de error.

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

Lo que está mal con mi plist? O es mi launchctrl comando equivocado en opciones?

12voto

Nate Puntos 220

El problema inmediato es que su .plist archivo no tiene el formato correcto -- el contenido de <string>...</string> debe ser codificado con entidades HTML, es decir, & necesita ser codificado como &amp; (nota: puede comprobar el formato de .plist archivos con plutil -lint filename.plist). Pero hay algunos otros cambios que necesitan ser hechas...

Los programas de inicio con launchd es bastante diferente que a partir de ellos desde una shell. La mayor diferencia es que a partir de la cáscara, desea que el programa pase a un segundo plano y ejecutar de forma independiente de la concha, por lo que se envuelve en nohup ... &. Con launchd, es realmente el mejor para el programa para permanecer en el "primer plano" para launchd puede mantener un ojo en ella.

También, los elementos de ProgramArguments no analizada por un proyectil, por lo que el listado de comando y sus argumentos, con espacios entre ellos no trabajan, hacen cada argumento un elemento separado de la matriz.

Aquí está mi intento de una sinergia .plist. Yo no he probado este, por lo que puede necesitar un poco de ajuste para que funcione correctamente (ver notas abajo):

<?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>

Los últimos dos teclas por encima de lidiar con la launchd debe reaccionar si/cuando el synergys programa se cierra. De forma predeterminada, mata a cualquier sobreviviente subprocesos y lanza una nueva instancia; estos dos teclas suprimir ambas partes, que puede o no puede ser lo que usted desea. También, una cosa esto no hace que su versión con nohup hace es redirigir la entrada estándar stdin y stdout nohup.(en caso de que el terminal va de distancia); en lugar IIRC launchd registros de las cosas que se envían a ellos. Si synergys es en el habbit de enviar la salida, es posible que desee agregar algo como esto para el .plist:

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

También, como mankoff, dijo, se debe poner esto en ~/Library/LaunchAgents por lo que estará en cargar cada vez que inicie sesión. Ah, y probablemente, usted debe agregar un local. prefijo del nombre de archivo (como hice con la etiqueta) para adaptarse a las DNS inversa de la convención de nomenclatura.

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