我用这个内容创build了文件/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不会在启动时运行,也不会创build日志文件。 (注意,我已经修改了rundeckd以在脚本中硬编码所需的$ RDECK_BASE envvariables)
更新
戈登·戴维森(Gordon Davisson),我已经按照你的说法修改了plist,并且没有修改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”,因为它不是一个交互式的shell。 https://stackoverflow.com/questions/11821378/what-does-bashno-job-control-in-this-shell-mean
您启动的plist将该项目标记为已禁用:
<key>Disabled</key> <true/>
为了让它运行,您需要将其更改为<false/> ,或者使用sudo launchctl load -w /System/Library/LaunchDaemons/com.rundeckd.plist使其成为永久的覆盖)。
另外,你有没有修改脚本,以避免自身的守护进程? 如果不是,您需要将<key>KeepAlive</key>更改为<false/> ,然后添加<key>AbandonProcessGroup</key><true/> 。
顺便说一下,你也可以在.plist中定义环境variables,而不必修改脚本来包含它们:
<key>EnvironmentVariables</key> <dict> <key>RDECK_BASE</key> <string>/Users/david/bin/rundeck</string> </dict>
最后,我build议更改标签和文件名 – 它们应该基于反向DNS命名约定 ,所以除非您拥有rundeckd.com域,否则不应该将其用作标签或标签字首。 对于这样的自制条目,我build议使用“本地”前缀,即“local.rundeckd”。
更新:作业控制仅在交互式shell中可用; 使用wait $PID而不是fg $PID 。
https://gist.github.com/dportabella/7714449
$RDECK_BASE/server/sbin/rundeck_launchd是一个启动rundeck而不将进程发送到后台的脚本(OSX Launchd要求)。
/System/Library/LaunchAgents/david.rundeck.plist是一个configuration文件,用于将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
File /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>