如何在系统启动时启动的两个守护进程之间建立依赖关系?
我想在系统启动时启动 sonar,但它需要 mysql 服务器已经启动并运行。
我没有找到在 launchd plist 中定义进程依赖关系的明确方法。
而在 launchd 的 Wikipedia 页面上,有这样一句话,非常鼓舞人心:
launchd 启动期间最难管理的部分是依赖关系。
Sonar 守护进程:
<?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>WorkingDirectory</key>
<string>/usr/local/Sonar/sonarinstall</string>
<key>Label</key>
<string>org.sonarsource.sonar</string>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>bin/macosx-universal-64/sonar.sh</string>
<string>start</string>
</array>
<key>UserName</key>
<string>server1</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
MySQL 守护进程:
<?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>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew.mxcl.mysql</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/mysql/bin/mysqld_safe</string>
<string>--bind-address=127.0.0.1</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/usr/local/var</string>
</dict>
</plist>
答案1
您也许能够通过改变KeepAlive
MySQL-plist 的 -Part 来实现您的目标。
以下内容(理论上)应该提供您正在寻找的内容:
<key>KeepAlive</key>
<dict>
<key>OtherJobEnabled</key>
<string>org.sonarsource.sonar</string>
</dict>
这应该会导致 MySQL 在 sonar 服务器之前启动,并且在 sonar 服务器运行时保持活动状态。
欲了解更多信息,请查看以下资源:
- https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html#//apple_ref/doc/man/5/launchd.plist
- http://nathangrigg.net/2012/07/schedule-jobs-using-launchd/
如果这不起作用,Apple 会要求您使用 InterProcessCommunication (IPC) 来使您的设置正常工作。但说实话,这超出了我的知识范围!其他人可能会加入进来。