OSX launchctl 목록이 내 plist를 찾지 못합니다.

OSX launchctl 목록이 내 plist를 찾지 못합니다.

/System/Library/LaunchDaemons/com.rundeckd.plist다음 내용으로 파일을 만들었습니다 .

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>com.rundeckd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/test/rundeck/server/sbin/rundeckd</string>
        <string>start</string>
    </array>
    <key>KeepAlive</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/test/rundeck/var/log/launchd_out.log</string>
    <key>StandardErrorPath</key>
    <string>/test/rundeck/var/log/launchd_sdd.log</string>
    <key>Debug</key>
    <true/>
</dict>
</plist>

그러나 sudo launchctl list에는 이 rundeckd가 표시되지 않습니다.

왜?

또한 rundeckd는 부팅 시 이를 실행하지 않으며 로그 파일도 생성되지 않습니다. (필수 $RDECK_BASE env 변수가 스크립트에 하드 코딩되도록 rundeckd를 수정했습니다)

업데이트

Gordon Davisson, 말씀하신 대로 plist를 수정했고 rundeckd 스크립트를 수정하지 않고 다음과 같은 결과를 얻었습니다.

nohup: can't detach from console: Inappropriate ioctl for device

그런 다음 다음과 같이 rundeckd에 "launchd" 옵션을 추가해 보았습니다(현재는 시작, 중지 및 상태가 있음).

launchd() {
    echo "%s" "launchd $prog: "
    touch $LOK_FILE
    $rundeckd 2>&1 >>$RDECK_BASE/var/log/service.log &
    PID=$!
    echo $PID > $PID_FILE
    fg $PID  # block until it is stopped
}

fg: no job control하지만 대화형 쉘이 아니기 때문에 "fg"를 실행할 수 없는 것 같아서 오류가 발생합니다 .https://stackoverflow.com/questions/11821378/what-does-bashno-job-control-in-this-shell-mean

답변1

시작된 plist는 항목을 비활성화된 것으로 표시합니다.

    <key>Disabled</key>
    <true/>

실행하려면 이를 로 변경하거나 <false/>로 재정의 해야 합니다 sudo launchctl load -w /System/Library/LaunchDaemons/com.rundeckd.plist( -w영구 재정의를 수행하게 함).

또한 자체 데몬화를 방지하기 위해 스크립트를 수정했습니까? 그렇지 않은 경우 <key>KeepAlive</key>로 변경 <false/>하고 을 추가 해야 합니다 <key>AbandonProcessGroup</key><true/>.

그런데, 환경 변수를 포함하도록 스크립트를 수정하는 대신 .plist에서 환경 변수를 정의할 수도 있습니다.

    <key>EnvironmentVariables</key>
    <dict>
        <key>RDECK_BASE</key>
        <string>/Users/david/bin/rundeck</string>
    </dict>

마지막으로 라벨 및 파일 이름을 변경하는 것이 좋습니다.역방향 DNS 명명 규칙, 따라서 rundeckd.com 도메인을 소유하지 않는 한 해당 도메인을 레이블이나 레이블 접두어로 사용해서는 안 됩니다. 이와 같이 직접 만든 항목의 경우 "local" 접두사, 즉 "local.rundeckd"를 사용하는 것이 좋습니다.

업데이트: 작업 제어는 대화형 셸에서만 사용할 수 있습니다. wait $PID대신 사용하십시오 fg $PID.

답변2

https://gist.github.com/dportabella/7714449

$RDECK_BASE/server/sbin/rundeck_launchd프로세스를 백그라운드로 보내지 않고 rundeck을 시작하는 스크립트입니다(OSX Launchd에 필요함).

/System/Library/LaunchAgents/david.rundeck.plistRundeck을 Mac OSX 실행 서비스로 설정하기 위한 구성 파일입니다. 필요에 따라 이 파일을 수정해야 합니다. 이 예에서 RDECK_BASE는 /Users/david/bin/rundeck입니다.

이 두 파일을 설치한 후 컴퓨터를 재부팅하면 부팅 시 rundeck이 시작됩니다.

그런 다음 rundeck 서비스를 중지, 시작하고 상태를 확인할 수 있습니다.

$ launchctl start david.rundeck
$ launchctl stop david.rundeck
$ launchctl list david.rundeck

(이 스크립트는 $RDECK_BASE/server/sbin/rundeckd 스크립트를 기반으로 합니다.)

파일$RDECK_BASE/server/sbin/rundeck_launchd

#!/bin/bash 
#
# rundeck_launchd    Startup script for the RunDeck Launcher install
#   paramaters:
#     - env vars: [RDECK_BASE, RDECK_PORT, RDECK_LAUNCHER]
#     - standard RDECK_PORT values: [http: 4440, https: 4443]

export RDECK_BASE=${0%/*/*/*}

# RDECK_BASE must be set and exist
[ -z "$RDECK_BASE" -o ! -d "$RDECK_BASE" ] && {
    echo "RDECK_BASE not set or does not exist" ;
    exit 1 ;
}

# Source installation profile
. $RDECK_BASE/etc/profile

# Get the Launcher Jar path
[ -z "$RDECK_LAUNCHER" ] && {
    # Defaults to location of first startup
    RDECK_LAUNCHER=$(ls $RDECK_BASE/rundeck-launcher-*.jar)
}
[ -r "$RDECK_LAUNCHER" ] || {
    echo "RDECK_LAUNCHER not found: $RDECK_LAUNCHER" 
    exit 1;
}

# lookup the server port from the tools config file
RDECK_PORT=`awk '/framework.server.port/ {print $3}' $RDECK_BASE/etc/framework.properties`

# set the ssl opts if https is configured
SSL_OPTS=
proto=$(awk '/framework.server.url = / {split($3, a, ":"); print a[1]}' $RDECK_BASE/etc/framework.properties)
[ "${proto:-http}" == "https" ] && {
   SSL_OPTS="-Drundeck.ssl.config=$RDECK_BASE/server/config/ssl.properties"
}

rundeckd="${JAVA_HOME}/bin/java ${RDECK_JVM} -Dserver.http.port=${RDECK_PORT:=4440} $SSL_OPTS -jar ${RDECK_LAUNCHER}"

[ -w $RDECK_BASE/var ] || {
    echo "RDECK_BASE dir not writable: $RDECK_BASE" 
    exit 1 ;
}

mkdir -p $RDECK_BASE/var/run
mkdir -p $RDECK_BASE/var/log
mkdir -p $RDECK_BASE/var/lock/subsys

$rundeckd 2>&1 >>$RDECK_BASE/var/log/service.log

파일/System/Library/LaunchAgents/david.rundeck.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>david.rundeck</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/david/bin/rundeck/server/sbin/rundeck_launchd</string>
    </array>
    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>david</string>
    <key>Debug</key>
    <true/>
</dict>
</plist>

관련 정보