Я уже давно устраняю эту проблему. Посоветовался с сетью, несколькими платформами для обмена стеками и форумами. Вот мое описание проблемы:
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?
Что я пробовал до сих пор
- Изменение файла plist, сведение к минимуму параметров, без KeepAlive, без OnDemand, включает параметр Program
- Смена владельца admin: колесо nsadmin: nsadmin admin: root
- Запуск в качестве 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
который работает с запуском процесса, но не с его остановкой снова.
Кто-нибудь еще сталкивался с этой проблемой, и есть ли что-то явно не так с моим подходом, который я могу изменить, чтобы решить эту проблему?