launchctl inicia o programa mas não lista o pid

1

Eu tenho resolvido esse problema há algum tempo. Consultou a web, várias plataformas de troca de pilha e fóruns de discussão. Aqui está a descrição do meu problema:

Usecase:

Eu tenho o naviserver instalado em um mac os x el capitan 10.11.6

Em vez de ligar

/usr/local/ns/bin/nsd -f -u nsadmin -g nsadmin -t /usr/local/ns/conf/nsd-config.tcl

para iniciar o servidor e um comando kill para parar o servidor Eu gostaria de gerenciá-lo através de um LaunchDaemon.

Descrição do problema:

Eu posso iniciar com sucesso um LaunchDaemon por meio de launchctl . No entanto, quando observando a lista launchctl , ela lista o plist sem um PID. Portanto, preciso parar o serviço manualmente por meio de kill - em vez disso, gostaria de poder interromper o serviço com launchctl stop .

Pergunta em essência:

Por que o launchctl não lista o PID do LaunchDaemon iniciado com sucesso?

O que tentei até agora

  1. Alterando o arquivo plist, minimizando parâmetros, sem KeepAlive, sem OnDemand, inclua o parâmetro Program
  2. Alterando as propriedades administrativas: roda nsadmin: nsadmin admin: root
  3. Executando como LaunchAgent através do diretório / Library / LaunchAgents

Aqui está o que eu fiz:

Eu tenho o seguinte plist em /Library/LaunchDaemons/org.naviserver.dev01.plist

<?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>org.naviserver.dev01</string>

               <key>ProgramArguments</key>
           <array>
                   <string>/usr/local/ns/bin/nsd</string>
                   <string>-u</string>
                   <string>nsadmin</string>
                   <string>-g</string>
                   <string>nsadmin</string>
                   <string>-t</string>
                   <string>/usr/local/ns/conf/nsd-config.tcl</string>
           </array>

           <key>StandardOutPath</key>
               <string>/usr/local/var/log/naviserver_daemon.log</string>

           <key>StandardErrorPath</key>
               <string>/usr/local/var/log/naviserver_daemon.log</string>
       </dict>
    </plist>

Os seguintes privilégios e propriedades aplicam-se

-rw-r--r--  1 root  admin  857 Aug 11 15:03 org.naviserver.dev01.plist

Iniciando o serviço funciona

sudo launchctl load org.naviserver.dev01.plist
sudo launchctl start org.naviserver.dev01

No entanto, a lista launchctl não mostra o PID do serviço

sudo launchctl list | grep naviserver
-   0   org.naviserver.dev01

Eu posso encontrar o processo em execução via

ps -ax | grep nsd

Atualmente, estou sempre reiniciando manualmente o servidor por meio de kill via PID, o que não é legal. Eu gostaria de gerenciar isso por meio de launchctl , que funciona com o início do processo, mas não com a interrupção dele novamente.

Alguém mais se deparou com esse problema e há algo obviamente errado com a minha abordagem, que eu posso mudar para resolver esse problema?

    
por Mike F 12.08.2016 / 16:29

1 resposta

2

Parece que você deixou o sinalizador -f (primeiro plano) fora da matriz ProgramArguments . Sem isso, o naviserver é executado novamente em segundo plano e depois sai, o que significa que o launchd não conhece o PID do processo do servidor (em segundo plano).

    
por 12.08.2016 / 17:44