lista launchctl OSX não encontra meu plist

2

Eu criei o arquivo /System/Library/LaunchDaemons/com.rundeckd.plist com este conteúdo:

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

No entanto, sudo launchctl list não mostra este rundeckd.

por quê?

também, o rundeckd não o executa no momento da inicialização, nem os arquivos de log são criados. (note que eu modifiquei o rundeckd para ter a variável env exigida pelo $ RDECK_BASE codificada no script)

Atualizar

Gordon Davisson, modifiquei o problema como você disse e sem modificar o script rundeckd, recebo o seguinte:

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

depois, tentei adicionar a opção "launchd" ao rundeckd (atualmente, havia start, stop e status), da seguinte maneira:

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
}

mas recebo o erro fg: no job control , pois parece que não consigo executar "fg" porque não é um shell interativo. link

    
por David Portabella 27.05.2013 / 15:35

2 respostas

0

link

$RDECK_BASE/server/sbin/rundeck_launchd é um script para iniciar o rundeck sem enviar o processo para o segundo plano (exigido pelo OSX Launchd).

/System/Library/LaunchAgents/david.rundeck.plist é um arquivo de configuração para configurar o rundeck como um serviço launchd do Mac OSX. Você precisa modificar este arquivo de acordo com suas necessidades. neste exemplo, RDECK_BASE é / Users / david / bin / rundeck.

depois de instalar esses dois arquivos, reinicie o computador e o rundeck será iniciado no momento da inicialização.

você pode parar, iniciar e ver o status do serviço de renovação:

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

(este script é baseado no script $ RDECK_BASE / server / sbin / rundeckd)

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

Arquivo /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>
    
por 30.11.2013 / 03:17
0

Seu nome de inicialização marca o item como desativado:

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

Para fazê-lo funcionar, você precisa alterá-lo para <false/> ou substituí-lo por sudo launchctl load -w /System/Library/LaunchDaemons/com.rundeckd.plist (o -w faz com que ele seja substituído permanentemente).

Além disso, você modificou o script para evitar a própria daemonização? Caso contrário, você precisará alterar <key>KeepAlive</key> para <false/> e adicionar <key>AbandonProcessGroup</key><true/> .

BTW, você também pode definir variáveis de ambiente no .plist em vez de ter que modificar o script para incluí-las:

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

E, finalmente, recomendo alterar o rótulo & filename - eles devem ser baseados em uma convenção de nomenclatura DNS reversa , portanto, a menos que você possua o domínio rundeckd.com , você não deveria estar usando isso como um rótulo ou prefixo de rótulo. Para entradas caseiras como essa, recomendo usar o prefixo "local", por exemplo, "local.rundeckd".

Atualização: o controle de trabalho está disponível apenas em shells interativos; use wait $PID em vez de fg $PID .

    
por 27.05.2013 / 20:21