Tengo un script de launchd donde el comando que estoy tratando de ejecutar es un error (aparentemente eso no es una palabra, ahora lo es), quejándose de un uso incorrecto.
El error específico que obtengo es el texto de uso del comando volcado al registro del sistema. De esto deduzco que la otra información (ruta al comando, sincronización, etc.) en el plist se está analizando correctamente, pero no las opciones del comando.
Después del uso del comando tengo una última línea:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
Pero eso solo significa "Salí con un error".
Sé que launchd divide el comando de sus opciones y en la página del manual le informa sobre los argumentos del programa: "... Tenga en cuenta: esta clave confunde a muchas personas. ¡Lea execvp (3) con mucho cuidado! .."
Bueno, leí execvp (3) y no soy el más sabio, así que te pregunto mucho.
Normalmente, ejecutando el comando desde la terminal se vería así:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
Esto funciona de maravilla.
Y así es como lo he dividido en la sección Programa / Argumentos de programa de mi pliego LaunchAgent:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host localhost</string>
<string>--passwd gobbledygook</string>
<string>--project http://setiathome.berkeley.edu/ update</string>
</array>
(para el registro, originalmente tenía la ruta a boinccmd \ escapado, pero eso no funciona, launchd escapa espacios en la ruta para usted)
He intentado dividir los argumentos aún más:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
Pero eso tampoco parecía funcionar.
Como siempre, estoy muy seguro de que me estoy perdiendo algo tan simple.
Gracias.
RESPONDER:
La primera línea de argumentos del programa debe ser el camino hacia el programa. Esto es lo que me estaba haciendo tropezar y, de hecho, lo que probablemente significaba el comentario "... ¡Lee con mucho cuidado! .." :) También descubrí que tenía que dividir los argumentos en sus componentes. Cuando tuve todo eso en su lugar, todo funciona de maravilla. Muchas gracias.
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
Una edición final para decir una explicación fácil de entender sobre POR QUÉ esto debería ser, vea la explicación de SirPavlova.
~ W
<string>--host localhost</string>
definitivamente no funcionará. Recuerde, cuando escribe una línea de comando en un shell, no tiene idea de qué es parte de una opción y qué es un argumento regular: simplemente se divide en espacios antes de pasar los argumentos al programa que se está ejecutando. Además, podría ayudar si mostrara el error exacto queboinccmd
informa.Respuestas:
La
Program
clave especifica el archivo a ejecutar, y laProgramArguments
clave especifica los argumentos que se pasarán al proceso de ejecución. Hablando estrictamente, puede pasar cualquier argumento que desee a un proceso, pero la convención es que el primero debe ser el nombre con el que se invocó el proceso, por lo que la mayoría de los programas ignoran su primer argumento. ‡ El archivo a ejecutar es obviamente información necesaria, pero siProgram
falta la clave, launchd finge que tiene el mismo valor que el primer argumento,ProgramArguments
simplemente por conveniencia .Su primer ejemplo comienza boinccmd y le da argumentos que serían equivalentes al comando de terminal
que le dice a boinccmd que lo invocaste como "--host localhost" y solo le pasaste dos argumentos extraños.
Su segundo ejemplo separa los argumentos correctamente, pero como sugirió Eddie Kelley, necesita uno insertado al frente. Le dice a boinccmd que lo invocó como "--host", luego pasó otros seis argumentos. boinccmd puede reconocer las últimas cinco como dos opciones, pero no tiene idea de qué se trata el negocio "localhost". Hasta donde puede ver boinccmd, fue invocado desde la terminal como
(tenga en cuenta la falta "--host").
boinccmd es probablemente uno de la gran mayoría de los programas a los que no les importa cuál es su primer argumento, por lo que probablemente podría simplemente empujar
<string>HELLO</string>
a la cabeza de laProgramArguments
matriz, pero probablemente sea más limpio eliminar laProgram
clave por completo y simplemente usar esto:‡ Puede parecer una redundancia sin sentido, pero algunos programas usan esto con buenos resultados: bash et al. actuar como shells de inicio de sesión si su primer argumento comienza con
-
, y Vim ingresa a varios modos de emulación si su primer argumento esed
o envi
lugar devim
.fuente
Basado en la página man para exec (3), parece que el primer argumento del programa debería ser la ruta al ejecutable:
Si puede especificar la ruta al ejecutable como argumento en el índice 0, puede ayudar ...
fuente