Esclarecimento sobre o uso do programa plarr e launchArguments do launchd plist

2

Alguém pode esclarecer como os parâmetros de configuração Program e ProgramArguments do launchd devem ser usados? Eu tentei registrar um serviço que na linha de comando eu começaria assim:

$ /foo/bar/baz/python /foo/bar/baz/service start

Eu tentei dividir isso de várias maneiras para o launchd:

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

ou

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service start</string>
</array>

ou

<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

ou

<key>Program</key>
<string>/bin/bash</string>
<key>ProgramArguments</key>
<array>
    <string>-c</string>
    <string>/foo/bar/baz/python /foo/bar/baz/service start</string>
</array>

e praticamente qualquer outra variação que pareça fazer sentido. O serviço sempre falhou com vários erros diferentes embora. A única coisa que funcionou foi criar um script .sh com a linha exata e executar esse via launchd.

Portanto, para entender os serviços do launchd de uma vez por todas: como o launchd usa esses dois parâmetros de configuração, como eu replicaria meu comando bash com eles e qual é a diferença entre os dois?
Ou estou talvez apenas tropeçando em um problema de executar este serviço específico com e sem algumas variáveis de ambiente que existem ao executá-lo via bash? O serviço em si não forneceu nenhum resultado útil.

Eu consultei o execvp(3) entrada manual conforme recomendado em launchd.plist(5) , mas não adiantou meu entendimento.

    
por deceze 12.06.2013 / 12:55

1 resposta

1

Se Program for especificado, será sempre o programa executado, mesmo que ProgramArguments tenha sido especificado também.

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

Nesse caso, o primeiro elemento em ProgramArguments não é realmente avaliado, mas é passado como argv[0] para o programa que está sendo executado. Geralmente isso não é necessário, mas tem seus usos. Por exemplo, o programa pode inspecionar argv[0] e executar em um modo diferente dependendo deste valor.

Para todo o resto, basta usar apenas ProgramArguments . Essa definição de trabalho funciona exatamente como a acima:

<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>
    
por 12.06.2013 / 17:47

Tags