簡體   English   中英

啟動OSX沒有使用teamcity代理運行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期望其作業在前台運行,可以監視它們,如果它們崩潰則重新啟動它們,在適當時關閉它們等等。基本上,所有的東西都是你的使用PID文件是launchd通常會照顧你的。 在這種情況下,直接的問題是當一個launchd的作業退出時(你的作業幾乎立即就會在后台運行teamcity之后),launchd將清除任何剩余的混亂, 包括殺死任何孤立的子進程,比如說, teamcity代理

你有兩個選擇:

  • 轉換為launchd的做事方式。 這意味着將agent.sh腳本替換為檢查先決條件,查找Java等,然后在前台運行teamcity代理的腳本。 實際上,最好是它exec代理,因此代理直接作為launchd的子進程運行,而不是shell的子進程(這是launchd的子進程); 這為launchd提供了一個更直接的連接來監控和管理它。
  • 通過將<key>AbandonProcessGroup</key><true/>到.plist,告訴launchd不要殺掉已放棄的子<key>AbandonProcessGroup</key><true/> 這更簡單,但選擇了launchd的所有其他管理功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM