我已经对这个问题进行故障排除一段时间了。查阅了网络、几个 stackexchange 平台和讨论论坛。以下是我的问题描述:
用例:
我在 mac os x el capitan 10.11.6 上安装了 naviserver
而不是打电话
/usr/local/ns/bin/nsd -f -u nsadmin -g nsadmin -t /usr/local/ns/conf/nsd-config.tcl
启动服务器并使用 kill 命令停止服务器,我想通过 LaunchDaemon 来管理它。
问题描述:
我可以通过 成功启动 LaunchDaemon launchctl
。但是查看launchctl
列表时,它列出的 plist 没有 PID。因此,我需要通过 手动停止服务kill
- 相反,我希望能够使用 停止服务launchctl stop
。
问题本质:
为什么 launchctl 没有列出已成功启动的 LaunchDaemon 的 PID?
到目前为止我尝试过
- 更改 plist 文件,最小化参数,无 KeepAlive,无 OnDemand,包含 Program 参数
- 更改所有权 admin:wheel nsadmin:nsadmin admin:root
- 通过 /Library/LaunchAgents 目录作为 LaunchAgent 运行
以下是我所做的:
我有以下 plist/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
目前我总是通过 PID 手动重启服务器kill
,这样不太好。我想通过这种方式来管理它,launchctl
这样可以启动进程,但不能再次停止它。
有没有其他人遇到过这个问题?我的方法是否存在明显错误?我可以改变哪些方法来解决这个问题?
答案1
看起来您没有将-f
(前台) 标志添加到ProgramArguments
数组中。如果没有该标志,naviserver 会在后台重新运行,然后退出,这意味着 launchd 不知道 (后台) 服务器进程的 PID。