我有一个shell脚本startup.sh
执行以下操作(创建一个RAM磁盘并启动teamcity代理):
#!/bin/bash
DISK=`/usr/bin/hdiutil attach -nobrowse -nomount ram://16777216`
/usr/sbin/diskutil erasevolume HFS+ "RamDiskCache" $DISK
/Users/administrator/buildAgent/bin/agent.sh start
我可以通过输入./startup.sh
从命令行运行它并且它正确运行。当我从launchd运行时,它只创建RAM磁盘,teamcity无法启动。
我的launchd plist位于〜/ Library / LaunchAgents
<?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.datafinch.teamcity</string>
<key>Program</key>
<string>/Users/administrator/startup.sh</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
我错过了什么?
修改
这是agent.sh文件:
https://gist.github.com/chriskooken/19f5856e3ce3c2322c53cb0afa69b057
答案 0 :(得分:3)
您的agent.sh脚本在后台启动teamcity代理,然后退出。这与管理作业的启动方式相反 - launchd期望其作业在前台运行,可以监视它们,如果它们崩溃则重新启动它们,在适当时关闭它们等等。基本上,你所有的东西都是使用PID文件是launchd通常会照顾你的。在这种情况下,直接的问题是当一个launchd的作业退出时(你的作业几乎立即就会在后台运行teamcity之后),launchd将清理任何剩余的混乱,包括杀死任何孤立的子进程,如,比如,团队代理。
您有两种选择:
exec
代理,因此代理直接作为launchd的子代运行,而不是shell的子代(它是launchd的子代);这为launchd提供了一个更直接的连接来监控和管理它。<key>AbandonProcessGroup</key><true/>
来终止已放弃的子进程。这样做比较简单,但是会让你选择launchd的所有其他管理功能。