0

我正在尝试为 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

4

1 回答 1

1

我对 cassandra 并不特别熟悉,但我的猜测是它本身就是守护进程(即进入后台)。launchd 不喜欢它的子进程自己守护进程;它希望然后留在可以监视它们的前景中。如果一个守护进程自己,launchd 认为它已经退出(从技术上讲,它已经退出),清理所有剩余的子进程(包括现在的守护进程),然后重新启动它。起泡,冲洗,重复。

根据cassandra wiki 中的这个条目,您可以将-f标志传递给 cassandra 以使其保持在前台,并保持 launchd 快乐:

<key>ProgramArguments</key>
<array>
    <string>/opt/local/bin/cassandra</string>
    <string>-f</string>
</array>
于 2011-09-19T23:16:31.663 回答