Die OSX-Launchctl-Liste findet meine plist nicht

Die OSX-Launchctl-Liste findet meine plist nicht

Ich habe die Datei /System/Library/LaunchDaemons/com.rundeckd.plistmit diesem Inhalt erstellt:

<?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>

Die sudo launchctl-Liste zeigt dieses Rundeckd jedoch nicht an.

Warum?

außerdem führt Rundeckd es nicht beim Booten aus und die Protokolldateien werden nie erstellt. (Hinweis: Ich habe Rundeckd so geändert, dass die erforderliche Umgebungsvariable $RDECK_BASE im Skript fest codiert ist.)

Aktualisieren

Gordon Davisson, ich habe die plist wie gesagt geändert und ohne das Rundeckd-Skript zu ändern, erhalte ich Folgendes:

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

dann habe ich versucht, die Option „launchd“ zu Rundeckd hinzuzufügen (aktuell gab es „Start“, „Stop“ und „Status“), und zwar wie folgt:

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
}

aber ich erhalte die Fehlermeldung fg: no job control, dass ich „fg“ anscheinend nicht ausführen kann, weil es keine interaktive Shell ist. https://stackoverflow.com/questions/11821378/was bedeutet bashno-job-control-in-this-shell

Antwort1

Ihre Launchd-Plist markiert das Element als deaktiviert:

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

Damit es ausgeführt wird, müssen Sie es entweder in ändern <false/>oder mit überschreiben sudo launchctl load -w /System/Library/LaunchDaemons/com.rundeckd.plist(das -wbewirkt eine permanente Überschreibung).

Haben Sie das Skript außerdem geändert, um eine Daemonisierung zu vermeiden? Wenn nicht, müssen Sie zu ändern <key>KeepAlive</key>und <false/>hinzufügen <key>AbandonProcessGroup</key><true/>.

Übrigens können Sie Umgebungsvariablen auch in der .plist definieren, anstatt das Skript ändern zu müssen, um sie einzuschließen:

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

Und schließlich würde ich empfehlen, das Label und den Dateinamen zu ändern - sie basieren auf einemReverse-DNS-Namenskonvention, wenn Sie also nicht Eigentümer der Domain rundeckd.com sind, sollten Sie diese nicht als Bezeichnung oder Bezeichnungspräfix verwenden. Für selbst erstellte Einträge wie diesen empfehle ich die Verwendung des Präfixes „local“, also „local.rundeckd“.

Update: Die Jobsteuerung ist nur in interaktiven Shells verfügbar; verwenden Sie wait $PIDanstelle von fg $PID.

Antwort2

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

$RDECK_BASE/server/sbin/rundeck_launchdist ein Skript zum Starten von Rundeck, ohne den Prozess in den Hintergrund zu senden (erforderlich für OSX Launchd).

/System/Library/LaunchAgents/david.rundeck.plistist eine Konfigurationsdatei zum Einrichten von Rundeck als Mac OSX-Launchd-Dienst. Sie müssen diese Datei Ihren Anforderungen entsprechend ändern. In diesem Beispiel ist RDECK_BASE /Users/david/bin/rundeck.

Starten Sie Ihren Computer nach der Installation dieser beiden Dateien neu und Rundeck wird beim Booten gestartet.

Sie können den Rundeck-Dienst dann stoppen, starten und seinen Status anzeigen:

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

(dieses Skript basiert auf dem Skript $RDECK_BASE/server/sbin/rundeckd)

Datei$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

Datei/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>

verwandte Informationen