launchctl запускает программу, но не перечисляет pid

1063
Mike F

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

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 

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

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

1

1 ответ на вопрос

2
Gordon Davisson

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

Боже мой! Большое спасибо за указание на это - это решило проблему. Спасибо! Mike F 7 лет назад 0