使用 teamcity 代理启动 OSX 而不是 运行 bash
Launchd OSX not running bash with teamcity agent
我有一个 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
您的 agent.sh 脚本在后台启动 teamcity 代理,然后退出。这与 launchd 管理作业的方式相反——launchd 期望它的作业在前台 运行,在那里它可以监视它们,如果它们崩溃则重新启动它们,在适当的时候关闭它们等等。基本上,所有您使用 PID 文件所做的事情是 launchd 通常会为您处理的事情。在这种情况下,直接的问题是,当 launchd 的一个作业退出时(你的作业几乎立即退出,在后台 运行s teamcity 之后),launchd 将清理任何遗留的混乱,包括杀死任何孤立的子进程,比如 teamcity agent.
您有两个选择:
- 转换为 launchd 做事方式。这将意味着将 agent.sh 脚本替换为执行诸如检查先决条件、查找 Java 等操作的脚本,然后 运行s teamcity 代理 在前台。实际上,最好是
exec
代理,所以代理 运行 直接作为 launchd 的 child,而不是 [=32= 的 child ](这是 launchd 的 child);这为 launchd 提供了更直接的连接来监控和管理它。
- 通过将
<key>AbandonProcessGroup</key><true/>
添加到 .plist 来告诉 launchd 不要终止废弃的子进程。这更简单,但会让您退出 launchd 的所有其他管理功能。
我有一个 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
您的 agent.sh 脚本在后台启动 teamcity 代理,然后退出。这与 launchd 管理作业的方式相反——launchd 期望它的作业在前台 运行,在那里它可以监视它们,如果它们崩溃则重新启动它们,在适当的时候关闭它们等等。基本上,所有您使用 PID 文件所做的事情是 launchd 通常会为您处理的事情。在这种情况下,直接的问题是,当 launchd 的一个作业退出时(你的作业几乎立即退出,在后台 运行s teamcity 之后),launchd 将清理任何遗留的混乱,包括杀死任何孤立的子进程,比如 teamcity agent.
您有两个选择:
- 转换为 launchd 做事方式。这将意味着将 agent.sh 脚本替换为执行诸如检查先决条件、查找 Java 等操作的脚本,然后 运行s teamcity 代理 在前台。实际上,最好是
exec
代理,所以代理 运行 直接作为 launchd 的 child,而不是 [=32= 的 child ](这是 launchd 的 child);这为 launchd 提供了更直接的连接来监控和管理它。 - 通过将
<key>AbandonProcessGroup</key><true/>
添加到 .plist 来告诉 launchd 不要终止废弃的子进程。这更简单,但会让您退出 launchd 的所有其他管理功能。