OS X - Como obter um daemon launchd simples trabalhando em Yosemite e El Capitan

3

Não estou acostumado a lançar o OS X. Eu criei vários daemons no passado, por último com o Mountain Lion Mavericks.

No entanto, pareço estar lutando para obter o mais simples dos plists trabalhando em Mavericks e El Capitan. Inicialmente, copiei meu plist que executa o Tomcat e o modifiquei para obter o WebSphere Liberty Profile em execução na inicialização. Depois de ver alguns erros, decidi tentar o seguinte exemplo plist da própria Apple [site] [1]. O seguinte não funciona:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

    <key>Label</key>
    <string>com.example.hello</string>

    <key>ProgramArguments</key>
    <array>
        <string>hello</string>
        <string>world</string>
    </array>

    <key>KeepAlive</key>
    <true/>

</dict>

Sempre que eu coloco o arquivo plist em / Library / LaunchDaemons e, em seguida, carrego o plist, vejo os seguintes erros no Console:

10/5/15 11:52:44.868 AM com.apple.xpc.launchd[1]: (com.example.hello) This service is defined to be constantly running and is inherently inefficient.

10/5/15 11:52:44.869 AM com.apple.xpc.launchd[1]: (com.example.hello[66956]) Service could not initialize: 15A284: xpcproxy + 12644 [1472][19011403-4854-3CCD-9FCF-49C36302EB40]: 0x2

10/5/15 11:52:44.870 AM com.apple.xpc.launchd[1]: (com.example.hello) Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

E é isso até a saída. Eu tentei gravar em um log StandardOutput e StandardError, mas os arquivos de log estão vazios.

Como estou vendo essa situação ocorrer tanto no Yosemite quanto no El Capitan, achei que deve ser algo com permissões:

-rw-r--r-- 1 root wheel 418 Oct 5 11:52 helloworld.plist

No entanto, tentei executar o daemon com permissões definidas para 644 e 755, mas ainda vejo o mesmo erro do console.

Eu estou negligenciando alguma coisa?

    
por Chris Harris 05.10.2015 / 19:12

3 respostas

1

Consegui criar um exemplo de trabalho baseado na ajuda de @Dooley_labs e @Spiff (obrigado).

O exemplo a seguir ecoará o Hello World ao arquivo de log especificado a cada 10 segundos. O console não mostra nenhuma saída, mas quando vejo o conteúdo do arquivo de log, vejo o Hello World sendo repetidamente gravado nele.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>

        <key>Label</key>
        <string>com.example.hello</string>

        <key>ProgramArguments</key>
        <array>
            <string>echo</string>
            <string>Hello World</string>
        </array>

        <key>KeepAlive</key>
        <true/>

        <key>StandardOutPath</key>
        <string>/var/log/helloworld.log</string>

    </dict>

</plist>
    
por 07.10.2015 / 17:33
1

Do jeito que eu vejo, <key>KeepAlive</key> está produzindo com.apple.xpc.launchd[1]: (com.example.hello) This service is defined to be constantly running and is inherently inefficient. Então diz a si mesmo para reiniciar o processo em 10 segundos a partir daquele <key> .

Não tenho 100% de certeza do que com.apple.xpc.launchd[1]: (com.example.hello[66956]) Service could not initialize: 15A284: xpcproxy + 12644 [1472][19011403-4854-3CCD-9FCF-49C36302EB40]: 0x2 está dizendo porque não tenho um log do evento, mas parece que ele está protestando contra o evento do <key> original porque não está executando mais nada com ele. Talvez tente remover o <key> ou alterá-lo para outra coisa? possivelmente:

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

<key>KeepAlive</key>
<false/>

ou

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

Mais uma vez, não tenho 100% de certeza, mas sugiro tentar algo assim. O SO protesta que o nó keepAlive não é necessário, então boa sorte.

    
por 05.10.2015 / 19:25
0

Você vai se dar um tapa quando ler isso, mas você não disse ao launchctl que executável executar!

A primeira resposta corretamente tem "echo" como o primeiro "ProgramArguments", mas não chegou a dizer que era o problema.

Eu acredito que você também poderia ter feito isso com a tecla "Program", mas não tenho certeza de que você não teria que repeti-lo na chave "ProgramArguments", que acredito ser o array arg [] passado para o executável.

Outra coisa a ter cuidado é sempre listar o caminho completo para executáveis. O launchd / launchctl é bem tight, mas ainda assim, um Bad Guy ™ poderia colocar um executável "echo" malicioso no $ PATH padrão em algum lugar, então esperar que o launchctl re-parse o LaunchDaemon plist.

    
por 03.03.2018 / 21:46