用于ActiveMQ的Mac Daemon

时间:2013-08-26 09:11:24

标签: macos activemq launchd

我已尝试设置ActiveMQ守护程序但到目前为止一直未成功。我似乎无法加载ActiveMQ。不知道我还能做些什么来完成这项工作?我可以通过运行命令ActiveMQ

来启动/Library/ActiveMQ/bin/macosx/activemq start

在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>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

3 个答案:

答案 0 :(得分:2)

您的.plist文件在几个方面看起来有误,这可能至少导致部分问题。首先,ProgramArguments中似乎有很多不相关的垃圾(可能是使用daemond的剩余物?)通常,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看到它被告知要运行的程序已经退出,并认为自己“OMG它已经崩溃了!我最好清理一下它并重新启动它!”
  4. 为了“清理混乱”,launchd杀死了任何剩余的后台进程;在这种情况下,这意味着它会杀死实际的守护进程。
  5. 由于已告知launchd使程序保持活动状态,因此它会启动一个新实例,一遍又一遍地重新启动整个序列。
  6. ......毋庸置疑,这种方法效果不佳。如果发生这种或类似情况,您有两种方法可以解决它:

    • 跳过启动脚本,并启动直接运行实际的守护程序。这是更好的方法,因为你获得了launchd监视,重启,停止等守护进程的能力。
    • 使用入门脚本,但告诉launchd退出时不要惊慌。将KeepAlive更改为false,然后添加<key>AbandonProcessGroup</key><true/>

答案 1 :(得分:1)

在终端

上运行以下命令
 sudo launchctl unload /Library/LaunchDaemons/activemq.plist

sudo launchctl remove com.apache.activemq

然后

sudo launchctl load -w /Library/LaunchDaemons/activemq.plist 

答案 2 :(得分: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>
相关问题