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