我想在 FreeBSD 11.0-RELEASE-p8 上运行一个 jar 作为守护进程。这是我拥有的服务文件:
!/bin/sh
## Service for the camp web site.
# PROVIDE: tabor-web
# REQUIRE: SERVERS mysql-server nginx
#
# Add the following line to /etc/rc.conf to enable camp web site:
# taborweb_enable (bool): Set to "NO" by default.
# Set to "YES" to enable camp web site.
#
. /etc/rc.subr
name="taborweb"
rcvar=taborweb_enable
pidfile="/var/run/${name}.pid"
logfile="/var/log/${name}.log"
taborweb_chdir="/usr/local/tabor-web"
#command="/usr/local/bin/java" #no, try daemon
command="/usr/sbin/daemon"
start_precmd="${name}_prestart"
procname="java"
load_rc_config $name
: ${taborweb_enable:=no}
taborweb_prestart() {
# set the daemon / java flags
rc_flags="-f -p ${pidfile} /usr/local/bin/java -jar ./tabor-web.jar >> ${logfile} 2>&1 ${rc_flags}"
touch $pidfile
}
taborweb_describe() {
echo "Service for running a camp web site."
}
run_rc_command "$1"
守护进程确实在开始时使用正确的 PID 创建了一个 PID 文件,但是当我尝试运行时
service tabor-web status
我得到回应
taborweb is not running.
当我检查它时
# ps -aux | grep java
我可以看到它正在运行(并且网络服务可以访问)。
root 2654 0.0 0.2 10428 2132 - Is 17:12 0:00.00 daemon: /usr/local/bin/java[2655] (daemon)
root 2655 0.0 17.1 1707364 172744 - I 17:12 0:20.07 /usr/local/openjdk8-jre/bin/java -jar ./tabor-web.jar
root 2943 0.0 0.0 404 316 0 R+ 17:45 0:00.00 grep java
cat /var/run/taborweb.pid
节目
2655
这对于自动观看来说当然不太好——即使网站打开了,看起来也像是挂了。好消息是守护程序按预期运行(如果我终止它,它会重新启动 Web 服务)。
但是我在脚本中缺少什么来显示正确的服务状态呢?
答案1
好吧,我发现了一个简单的错误。该服务正在寻找 java 服务的 PID 文件。但它应该一直在寻找守护进程的 PID 文件。
pidfile_child="/var/run/${name}.pid"
pidfile="/var/run/${name}_daemon.pid"
进而
rc_flags="-r -P ${pidfile} -p ${pidfile_child} /usr/local/bin/java -jar ./tabor-web.jar >> /var/log/taborweb.log 2>&1 ${rc_flags}"
现在它按预期工作了。