start-stop-daemon이 pid 파일을 쓰지 않습니다

start-stop-daemon이 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 \

이는 쉘 스크립트의 주석이 작동하는 방식이 아닙니다. 두 가지 명령을 실행했습니다.

시작-중지-데몬--시작--조용함
그리고

--make-pidfile --pidfile $PIDFILE --exec $JAVA --test > /dev/null

이런 방식으로 명령 매개변수에 주석을 달지 마십시오.

System 5 사용이 절망적인 분들을 위해 rcSystem 5 스크립트와 PID 파일이 답답하신 분들을 위해systemd로 마이그레이션하기 위한 첫 번째 규칙Philips Hue 홈 자동화 브리지와 함께 작동합니다. 이 특별한 경우에는 다음을 찾을 수 있습니다.BWS Systems가 이미 작성한 서비스 단위초보자용.

daemontools의 세계에서 run이러한 서비스를 위한 프로그램은 확실히 간단합니다. 특히 Java가 간단한 경우에는 더욱 그렇습니다 /usr/bin/java. 다음은 그러한 것 중 하나입니다:

#!/빈/노쉬
setuidgidpi
사용자 환경
chdir /home/pi/habridge
자바 -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar

물론, 루트가 아닌 사용자로 Java 프로그램을 실행한다는 것은(이 run프로그램처럼) 원하는 대로 소켓을 포트 80에 바인딩할 수 없다는 것을 의미합니다. 의심할 바 없이 이것이 여러분이 --chuidSystem 5 스크립트에서 해당 옵션을 주석 처리 하려고 시도한 이유입니다 .rc

이상적인 세계에서 Java 프로그램은 이를 수행하지 않고 대신 다음과 같은 것을 사용합니다.tcp-socket-listen실행하기 전에 청취 소켓 바인딩setuidgid권한을 삭제하고 Java 프로그램을 실행하면 이 자체에 대해 걱정할 필요 없이 청취 소켓을 열린 파일 설명자 #3으로 받아들입니다.

아이디어는서비스 관리 시스템은 서비스에 대해 이를 수행할 수 있습니다.daemontools 세계의 경우 systemd, launchd 또는 심지어 inetd.run스낵 키트하지만사람에게는 선택권이 있다툴킷데몬 관리그리고캘리포니아 대학교, 샌디에고)다음과 같습니다:

#!/빈/노쉬
tcp-socket-listen --numeric-host --backlog 2 --bind-to-any 128.168.1.40 www-http
setuidgidpi
사용자 환경
chdir /home/pi/habridge
자바 -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar

물론 이러한 많은 Java 프로그램은 분명히 이 아이디어를 따라잡지 못했습니다.이미 열려 있는 통신 소켓을 전달하고 있습니다.. 따라서 여기서 호출되기 전까지는 Java를 실행할 수 없으며 setuidgid, 슈퍼유저 권한으로 실행되는 다른 Java 데몬을 신뢰해야 합니다.

내가 이것을 언급하는 이유는 daemontools 스타일 run스크립트를 사용하는 것이 다음과 같은 것들에 의해 지원되기 때문입니다.nosh그리고로랑 베르코execlineb, 그리고 systemd의 서비스 유닛인할 수 있는원하는 방식으로 의견을 제시하세요.

시스템 서비스 단위에서는 .INI 파일 주석을 사용하여 수퍼유저 권한을 제거하는 부분을 주석 처리할 수 있습니다.

;사용자=pi
;그룹=파이
위의 첫 번째 run프로그램을 다음과 같이 수정하세요.

#!/빈/노쉬
#setuidgidpi
#userenv
chdir /home/pi/habridge
자바 -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar

관련 정보