19 votos

Llegar launchd leer los argumentos de programa correctamente

Tengo un launchd script donde el comando estoy tratando de ejecutar es erroring (al parecer eso no es una palabra, es ahora), quejándose de un uso inadecuado.

El error específico que voy es que el comando de uso del texto objeto de dumping en el registro del sistema. De esto deduzco que el resto de la información (ruta de acceso para el comando, el momento, etc.) en el plist se analiza correctamente, no sólo de las opciones del comando.

Después de que el 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 que "me sale con un error".

Sé launchd divide el comando de sus opciones, y en la página man le dice a usted acerca de ProgramArguments: "...por Favor nota: muchas personas están confundidas por esta clave. Por favor, lea execvp(3) muy cuidadosamente!.."

También he leído execvp(3) y estoy ninguno de los sabios, por lo que estoy pidiendo a usted encantadora mucho.

Normalmente, se ejecuta el comando desde la terminal que iba a tener este aspecto:

/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

Esto funciona de maravilla.

Y así es como yo la hemos dividido en el Programa/ProgramArguments sección de mi LaunchAgent plist:

<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, yo tenía originalmente la ruta de acceso a boinccmd \escapó, pero que no funciona, launchd escapa de espacios en la ruta de acceso para usted)

He intentado dividir los argumentos más abajo:

<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 no parece funcionar bien.

Como siempre, estoy muy seguro de que me estoy perdiendo algo tan simple.

Gracias.


RESPUESTA:

La primera línea de ProgramArguments debe ser la ruta de acceso al programa. Esto es lo que estaba disparo de mí y de hecho lo fue, probablemente, al decir "...por Favor, lea muy cuidadosamente!.." comentario :) También encontré tuve que dividir los argumentos de sus partes componentes. Cuando yo tenía todo eso en lugar de la totalidad de la cosa 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 decir para un fácil comprender la explicación de por QUÉ esto debería ser, consulte SirPavlova explicación.

~W

20voto

Ronnie Puntos 1863

El Program clave especifica el archivo a ejecutar, & ProgramArguments clave especifica los argumentos que se pasan al proceso en ejecución. Estrictamente hablando, usted puede pasar cualquier cosa argumentos que desea a un proceso, pero la convención es que el primero debe ser el nombre por el que el proceso se invoca, por lo que la mayoría de los programas de ignorar su primer argumento. El archivo a ejecutar es, obviamente, la información necesaria, pero si la Program clave está en falta, launchd pretende que tiene el mismo valor que el primer argumento en ProgramArguments exclusivamente como una comodidad.

Su primer ejemplo se inicia boinccmd y le da argumentos que sería el equivalente a la terminal de comandos

--host\ localhost --passwd\ gobbledygook --project\ http://setiathome.berkeley.edu/\ update

que dice boinccmd que invoca como "--host localhost" y sólo pasó dos extraños argumentos.

El segundo ejemplo que separa los argumentos correctamente, pero como Eddie Kelley sugirió que necesita una insertado en la parte delantera. Se dice boinccmd que invoca como "--host", luego pasó otros seis argumentos. boinccmd pueden reconocer a los últimos cinco como dos opciones, pero no tiene idea de lo que es el "localhost" el negocio es de unos. Tan lejos como boinccmd puede decir, que fue invocada desde la terminal como

/Library/Application\ Support/BOINC\ Data/boinccmd localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update

(nota de la falta "--host").

boinccmd es probablemente uno de la gran mayoría de los programas que no te importa lo que su primer argumento es, por lo que probablemente podría en realidad sólo un empujón, <string>HELLO</string> a la cabeza de la ProgramArguments de la matriz, pero es probablemente más limpio para quitar el Program clave por completo y sólo tiene que utilizar esta:

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

Puede parecer un sin sentido redundancia, pero algunos programas utilizan esta a buen efecto: bash et al. actuar como shells de inicio de sesión si su primer argumento comienza con -, & Vim entra diversos modos de emulación de si su primer argumento es ed o vi en lugar de vim.

6voto

Jonathan Sampson Puntos 121800

Basado en la página man de exec(3), parece que el primer programa argumento debe ser la ruta de acceso al ejecutable:

The execv(), execvp(), and execvP() functions provide an array of pointers to null-terminated strings
 that represent the argument list available to the new program.  The first argument, by convention,
 should point to the file name associated with the file being executed. The array of pointers must be
 terminated by a NULL pointer.

Si usted puede especificar la ruta de acceso al ejecutable como el argumento en el índice 0, puede ayudar a...

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