1

我试过设置ActiveMQ守护进程,但到目前为止一直没有成功。我似乎无法加载ActiveMQ。不知道我还能做些什么来完成这项工作?我可以ActiveMQ通过运行命令开始/Library/ActiveMQ/bin/macosx/activemq start

在列表中

<?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>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>com.apache.activemq</string>
    <key>ProgramArguments</key>
    <array>            
        <string>/Library/ActiveMQ/bin/macosx/activemq</string>
        <string>start</string>
        <string>;</string>
        <string>--stop-cmd</string>
        <string>/Library/ActiveMQ/bin/macosx/activemq</string>
        <string>stop</string>
        <string>;</string>
        <string>--restart-cmd</string>
        <string>/Library/ActiveMQ/bin/macosx/activemq</string>
        <string>restart</string>
        <string>;</string>
        <string>--pid=none</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/Library/ActiveMQ</string>
    <key>ServiceDescription</key>
    <string>ActiveMQ</string>
    <key>StandardErrorPath</key>
    <string>/var/log/activemq.stderr</string>
    <key>StandardOutPath</key>
    <string>/var/log/activemq.stdout</string>
</dict>
</plist>

执行launchctl命令的结果

macosx user$ sudo launchctl load -w /Library/LaunchDaemons/activemq.plist com.apache.activemq: Already loaded

4

3 回答 3

2

您的 .plist 文件在几个方面看起来都是错误的,这可能至少导致了部分问题。首先,ProgramArguments 里面似乎有很多不相关的垃圾(可能是使用守护进程的遗留物?) 一般来说,ProgramArguments 的第一个参数应该是您要执行的程序的路径,其余的应该是它的参数。在我看来,这就是你应该拥有的一切:

<key>ProgramArguments</key>
<array>            
    <string>/Library/ActiveMQ/bin/macosx/activemq</string>
    <string>start</string>
</array>            

其次,那个“开始”参数让我认为这不是真正的守护程序,而是一个在后台启动守护程序然后退出的管理脚本。当您手动运行时/Library/ActiveMQ/bin/macosx/activemq start,它会退出(即给您一个新的 shell 提示符)并让守护程序在后台运行吗?launchd 不希望这样,它希望直接运行守护进程,以便它可以监视它并在必要时重新启动它。这是您告诉 launchd 运行启动脚本而不是实际守护程序时的典型顺序:

  1. launchd 运行启动脚本。
  2. 启动脚本在后台运行守护程序,然后退出。
  3. launchd 看到它被告知运行的程序已经退出,并且认为“天哪,它崩溃了!我最好清理一下这个烂摊子并重新启动它!”
  4. 为了“清理混乱”,launchd 会杀死所有剩余的后台进程;在这种情况下,这意味着它会杀死实际的守护进程。
  5. 由于 launchd 被告知要让程序保持活动状态,它会启动一个新实例,一遍又一遍地重新启动整个序列。

...不用说,这不是很好。如果发生这种情况或类似情况,您有两种选择来解决它:

  • 跳过启动脚本,并已 launchd 直接运行实际的守护程序。这是更好的方法,因为您获得了 launchd 监视、重新启动、停止等守护进程的能力。
  • 使用启动脚本,但告诉 launchd 在退出时不要恐慌。更改KeepAlive为false,并添加<key>AbandonProcessGroup</key><true/>
于 2013-08-26T22:23:59.520 回答
1

在终端上运行以下命令

 sudo launchctl unload /Library/LaunchDaemons/activemq.plist

或者

sudo launchctl remove com.apache.activemq

然后

sudo launchctl load -w /Library/LaunchDaemons/activemq.plist 
于 2013-08-26T09:13:38.370 回答
0

我遵循了@Gordon Davisson 的想法

但我正在调用 activemq 控制台而不是activemq start ,它现在正在工作。

这里是完整的 plist 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>/usr/local/Cellar/activemq/5.13.2/bin/activemq</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/Cellar/activemq/5.13.2/bin/activemq</string>
        <string>console</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>WorkingDirectory</key>
    <string>/usr/local/Cellar/activemq/5.13.2/libexec/data</string>
</dict>
</plist>
于 2016-05-05T20:01:51.127 回答