已经在start-stop-daemon中添加了--make-pidfile,但仍然看不到正在创建的pid文件。任何人都可以帮忙为什么?
#!/bin/bash
### BEGIN INIT INFO
# FIXME: set Provides and Short-Description
# Provides: echobridge
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: initscript for echobridge
### END INIT INFO
# FIXME: your name here
# Author: Leonid Shevtsov <[email protected]>
# Do NOT "set -e"
PATH=/sbin:/usr/sbin:/bin:/usr/bin
# FIXME: configure your app here
DESC="home automation phillips hue emulator"
NAME="echobridge"
CWD=/home/pi/EchoBridge
DATA=/home/pi/EchoBridge/data
#IP=128.168.1.40
#PORT=80
USER=pi
GROUP=pi
JAVA="/usr/bin/java"
JVM_ARGS="-Dconfig.file=$DATA/habridge.config"
JAR_PATH=/home/pi/EchoBridge/ha-bridge-3.2.1.jar
#JAR_PATH=/home/pi/EchoBridge/ha-bridge-3.1.0.jar
JAVA_ARGS="$JVM_ARGS -jar $JAR_PATH"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
# Test that Java is installed
if [ ! -x "$JAVA" ]; then
echo "Java executable not found at $JAVA"
exit 2
fi
# Test that the application jar is present
if [ ! -r "$JAR_PATH" ]; then
echo "Application JAR not found at $JAR_PATH"
exit 2
fi
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start \
--quiet \
# --name $NAME \
--make-pidfile \
--pidfile $PIDFILE \
--exec $JAVA \
--test > /dev/null \
|| return 1
# FIXME: export environment variables here
# export PORT=8070
start-stop-daemon --start \
--quiet \
# --name $NAME \
--make-pidfile \
--pidfile $PIDFILE \
# --chuid $USER:$GROUP \
--chdir $CWD \
--background \
--exec $JAVA \
-- $JAVA_ARGS \
|| return 2
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop \
--quiet \
# --name $NAME \
--pidfile $PIDFILE \
--exec $JAVA \
--retry=TERM/30/KILL/5
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that checks if the daemon is running
#
do_status()
{
start-stop-daemon \
--start \
--test \
--oknodo \
--pidfile $PIDFILE \
--exec $JAVA
}
case "$1" in
start)
[ "$VERBOSE" != no ] && echo "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && echo 0 ;;
2) [ "$VERBOSE" != no ] && echo 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && echo "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && echo 0 ;;
2) [ "$VERBOSE" != no ] && echo 1 ;;
esac
;;
status)
do_status
;;
restart|force-reload)
echo "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) echo 0 ;;
1) echo 1 ;; # Old process is still running
*) echo 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
echo 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac***
答案1
启动-停止-守护进程--启动\ - 安静的 \ # --name $NAME \ --make-pidfile \ --pidfile $PIDFILE \ --exec $JAVA \ --测试 > /dev/null \
shell 脚本中的注释不是这样工作的。您已经发出了两个命令,
启动-停止-守护进程--启动--安静和
--make-pidfile --pidfile $PIDFILE --exec $JAVA --test > /dev/null
不要尝试以这种方式注释命令参数。
对于那些对系统5的使用感到绝望的围观者rc
对于那些对 System 5脚本和 PID 文件迁移到 systemd 的第一条规则确实适用于飞利浦 Hue 家庭自动化桥。在这种特殊情况下,人们可以发现BWS Systems 已经编写的服务单元对于初学者。
在 daemontools 世界中,run
此类服务的程序当然很简单,尤其是在 Java 很简单的情况下/usr/bin/java
。这是这样的一个:
#!/bin/nosh setuidgid pi 用户环境 chdir /home/pi/habridge java -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar
当然,以非超级用户身份运行 Java 程序(如该run
程序所做的那样)意味着它无法按照自己的意愿将套接字绑定到端口 80。毫无疑问,这就是为什么您一直试图--chuid
在 System 5脚本中注释掉该选项。rc
在理想的世界中,Java 程序不会这样做,而是会使用类似的东西tcp-socket-listen
在运行之前绑定监听套接字setuidgid
放弃特权并运行 Java 程序,该程序将简单地接受侦听套接字作为打开文件描述符 #3,而不必担心任何这些本身。
这个想法是服务管理系统可以为服务执行此操作对于 daemontools 世界、systemd、launchd 甚至inetd
.一个守护进程工具run
程序(再次使用小吃工具包虽然一个人有一个选择工具包用于守护进程管理并为加州大学圣地亚哥分校)看起来像:
#!/bin/nosh tcp-socket-listen --numeric-host --backlog 2 --bind-to-any 128.168.1.40 www-http setuidgid pi 用户环境 chdir /home/pi/habridge java -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar
当然,许多这样的 Java 程序显然还没有跟上这个想法正在传递他们的通信套接字已经打开。因此,在此处调用 Java 之前无法运行setuidgid
,并且必须信任另一个以超级用户权限运行的 Java 守护进程。
我提到这一点的原因是,使用 daemontools 风格的run
脚本由诸如nosh
和洛朗·贝尔科特execlineb
,以及 systemd 的服务单元,一能以您想要的方式评论事物。
在 systemd 服务单元中,可以使用 .INI 文件注释注释掉删除超级用户权限的部分:
;用户=pi ;组=pi将上述第一个
run
程序修改如下:#!/bin/nosh #setuidgid pi #userenv chdir /home/pi/habridge java -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar