启动OSX没有使用teamcity代理运行bash

Chr*_*ken 6 bash teamcity 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
Run Code Online (Sandbox Code Playgroud)

我可以通过键入命令行./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>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

编辑

这是agent.sh文件:

https://gist.github.com/chriskooken/19f5856e3ce3c2322c53cb0afa69b057

Gor*_*son 3

您的 agent.sh 脚本在后台启动 teamcity 代理,然后退出。这与 launchd 管理作业的方式相反——launchd 期望它的作业在前台运行,在那里它可以监视它们,在它们崩溃时重新启动它们,在适当的时候关闭它们,等等。基本上,您所要做的所有事情launchd 通常会为您处理处理 PID 文件的事情。在这种情况下,直接的问题是,当 launchd 的一个作业退出时(您的作业几乎立即执行,在后台运行 teamcity 后),launchd 将清理任何剩余的混乱,包括杀死任何孤立的子进程,例如团队城市代理

你有两个选择:

  • 转换为 launchd 的处理方式。这意味着将 agent.sh 脚本替换为执行检查先决条件、查找 Java 等操作的脚本,然后在前台运行 teamcity 代理。实际上,最好是exec代理,这样代理就可以直接作为 launchd 的子级运行,而不是 shell 的子级(shell 是 launchd 的子级);这为 launchd 提供了更直接的连接来监视和管理它。
  • <key>AbandonProcessGroup</key><true/>告诉 launchd 不要通过添加到 .plist来终止废弃的子进程。这更简单,但会选择您退出 launchd 的所有其他管理功能。