Я создал файл /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 не показывает этот файл rundeckd.
Зачем?
Кроме того, rundeckd не запускает его во время загрузки, и файлы журнала никогда не создаются. (обратите внимание, я модифицировал rundeckd, чтобы в скрипте была жестко запрограммирована необходимая переменная env $ RDECK_BASE)
Обновить
Гордон Дэвиссон, я изменил список, как вы сказали, и, не изменяя скрипт rundeckd, я получаю следующее:
nohup: can't detach from console: Inappropriate ioctl for device
Затем я попытался добавить параметр «launchd» в rundeckd (в настоящее время были запуск, остановка и статус) следующим образом:
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
https://gist.github.com/dportabella/7714449
$RDECK_BASE/server/sbin/rundeck_launchd
- это сценарий для запуска rundeck без отправки процесса в фоновый режим (требуется OSX Launchd).
/System/Library/LaunchAgents/david.rundeck.plist
- это файл конфигурации для настройки rundeck в качестве службы запуска 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>
В вашем списке запуска этот элемент помечается как отключенный:
<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
.