1

Я уже давно устраняю эту проблему. Посоветовался с сетью, несколькими платформами для обмена стеками и форумами. Вот мое описание проблемы:

USECASE:

У меня есть Naviserver установлен на Mac OS X El Capitan 10.11.6

Вместо звонка

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

чтобы запустить сервер и команду kill, чтобы остановить сервер, я хотел бы управлять им через LaunchDaemon.

Описание проблемы:

Я могу успешно запустить LaunchDaemon через launchctl . Однако при просмотре списка launchctl он перечисляет список без PID. Поэтому мне нужно вручную остановить службу с помощью kill - вместо этого я хотел бы иметь возможность остановить службу с помощью launchctl stop .

Вопрос по существу:

Почему launchctl не перечисляет PID успешно запущенного LaunchDaemon?

Что я пробовал до сих пор

  1. Изменение файла plist, сведение к минимуму параметров, без KeepAlive, без OnDemand, включает параметр Program
  2. Смена владельца admin: колесо nsadmin: nsadmin admin: root
  3. Запуск в качестве LaunchAgent через каталог /Library /LaunchAgents

Вот что я сделал:

У меня есть следующий /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>

Применяются следующие привилегии и права собственности

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

Запуск сервисных работ

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

Однако в списке launchctl не отображается PID службы

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

Я могу найти запущенный процесс через

ps -ax | grep nsd

В настоящее время я всегда вручную перезагрузить сервер через kill через PID, который не является хорошим. Я хотел бы управлять этим с помощью launchctl который работает с запуском процесса, но не с его остановкой снова.

Кто-нибудь еще сталкивался с этой проблемой, и есть ли что-то явно не так с моим подходом, который я могу изменить, чтобы решить эту проблему?

1 ответ1

2

Похоже, вы оставили флаг -f (передний план) вне массива ProgramArguments . Без этого naviserver перезапускается в фоновом режиме и затем завершается, что означает, что launchd не знает PID (фонового) серверного процесса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .