[英]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代理 。
你有兩個選擇:
exec
代理,因此代理直接作為launchd的子進程運行,而不是shell的子進程(這是launchd的子進程); 這為launchd提供了一個更直接的連接來監控和管理它。 <key>AbandonProcessGroup</key><true/>
到.plist,告訴launchd不要殺掉已放棄的子<key>AbandonProcessGroup</key><true/>
。 這更簡單,但選擇了launchd的所有其他管理功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.