2016-12-20 40 views
6

Mam skrypt startup.sh które wykonuje następujące (utworzyć dysk RAM i uruchomić agenta TeamCity):launchd OSX nie działa bash środkiem 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 

mogę uruchomić z wiersza poleceń, wpisując ./startup.sh i działa poprawnie. Kiedy uruchamiam z launchd, TYLKO tworzy dysk RAM, teamcity się nie uruchamia.

Moja launchd plist znajduje się w ~/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> 

Czego mi brakuje?

EDIT

Oto plik agent.sh:

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

+0

@ Andlrc przepraszam, to była moja ostatnia próba. Zaktualizowałem pytanie: –

+0

Co zawiera plik '/ Users/administrator/buildAgent/bin/agent.sh'? –

+0

@MarkSetchell Dodałem istota tego pliku do pytania –

Odpowiedz

3

Skrypt agent.sh uruchamia agenta TeamCity w tle, a następnie kończy działanie. Jest to sprzeczne z uruchomionym sposobem zarządzania zadaniami - launchd oczekuje, że jego zadania będą działały na pierwszym planie, gdzie może je monitorować, restartować je w razie awarii, wyłączyć je w razie potrzeby itp. Zasadniczo wszystkie rzeczy, którymi jesteś robienie tego z plikiem PID jest tym, co standardowo uruchamia launchd. W tym przypadku bezpośrednim problemem jest to, że gdy jedno z zadań launchd zostanie zakończone (co zrobi prawie natychmiast, po uruchomieniu teamcity w tle), launchd wyczyści każdy pozostały bałagan, włącznie z zabiciem każdego osieroconego podprocesu, np. agent teamcity.

Masz dwie możliwości:

  • przekształca w launchd sposób robienia rzeczy. Będzie to oznaczać zastąpienie skryptu agent.sh programem, który wykonuje takie czynności, jak sprawdzanie wymagań wstępnych, znajdowanie języka Java itd., A następnie uruchamia na pierwszym planie agenta teamcity na pierwszym planie:. Właściwie najlepiej jest, jeśli jest to agent, więc agent działa bezpośrednio jako dziecko z launchd, a nie dziecko powłoki (która jest dzieckiem launchd); dzięki temu uruchamiane jest bardziej bezpośrednie połączenie z monitorem i zarządzaniem nim.
  • Powiedz, żeby nie zabijać opuszczonych podprocesów, dodając do .plist. Jest to prostsze, ale wyłącza wszystkie inne funkcje zarządzania programu launchd.
+0

To działało idealnie. Na razie używałem AbandonProcessGroup. Dzięki! –