OSX LaunchAgent for app启动另一个应用程序

时间:2011-09-19 21:45:26

标签: macos daemon agent launch-agent launch-daemon

我正在尝试为cassandra设置一个本地LaunchAgent并遇到问题,因为bin/cassandra只是一个启动的shell脚本:

/usr/bin/java -ea -javaagent:blah blah blah blah blah blah blah

我的LaunchAgent启动了脚本,但要么从不启动cassandra,要么不允许它产生子进程,或者,我不完全确定发生了什么,但似乎我之前遇到过这个问题。我知道让这个工作的唯一方法是改变我的LaunchAgent:

<?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>com.cassandra.agent</string>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

    <key>UserName</key>
    <string>root</string>

    <key>ProgramArguments</key>
    <array>
        <string>/path/to/cassandra/bin/cassandra</string>
    </array>

    <key>WorkingDirectory</key>
    <string>/path/to/cassandra/bin</string>
</dict>
</plist>

为...

...
<key>ProgramArguments</key>
<array>
    <string>/usr/bin/java</string>
    <string>-ea</string>
    <string>-javaagent:blah</string>
    <string>blah</string>
    <string>blah</string>
    <string>blah</string>
    <string>blah</string>
    <string>blah</string>
    <string>blah</string>
</array>

我想知道是否有人知道如何从LaunchAgent引用shell脚本而不是从ps aux拉出所有args

1 个答案:

答案 0 :(得分:1)

我并不是特别熟悉cassandra,但我猜测它是守护自己(即落入后台)。 launchd不喜欢它的孩子自己守护;它希望能够留在前景中,以便能够密切关注它们。如果一个守护进程本身,launchd认为它已退出(技术上,它已经退出),清理任何剩余的子进程(包括现在守护进程),并重新启动它。泡沫,冲洗,重复。

根据this entry in the cassandra wiki,您可以传递cassandra -f标志以使其保持在前台,并保持launchd愉快:

<key>ProgramArguments</key>
<array>
    <string>/opt/local/bin/cassandra</string>
    <string>-f</string>
</array>