启动-停止-守护进程没有写入pid文件

启动-停止-守护进程没有写入pid文件

已经在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

相关内容