launchctl 启动程序但不列出 pid

launchctl 启动程序但不列出 pid

我已经对这个问题进行故障排除一段时间了。查阅了网络、几个 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?

到目前为止我尝试过

  1. 更改 plist 文件,最小化参数,无 KeepAlive,无 OnDemand,包含 Program 参数
  2. 更改所有权 admin:wheel nsadmin:nsadmin admin:root
  3. 通过 /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。

相关内容