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 \

これはシェルスクリプトのコメントが機能する方法ではありません。 2つのコマンドを実行しました。

スタート-ストップ-デーモン--スタート--静か
そして

--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。以下はそのようなものの1つです:

#!/空/ノッシュ
setuidgidpi
ユーザーエクスペリエンス
chdir /home/pi/habridge
Java -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar

もちろん、root以外のユーザーとしてJavaプログラムを実行することは、(このrunプログラムのように)必要に応じてソケットをポート80にバインドできないことを意味します。疑いなく、これが--chuidSystem 5スクリプトでそのオプションをコメントアウトしようとした理由です。rc

理想的な世界では、Javaプログラムはこれを実行せず、代わりに次のようなものを使用します。tcp-socket-listen実行前にリスニングソケットバインディングsetuidgid権限を削除してJavaプログラムを実行すると、それ自体を心配することなく、リスニングソケットを開いたファイル記述子#3として受け入れます。

アイデアはサービス管理システムはサービスに対してこれを実行できます。daemontools 世界の場合、systemd、launchd、またはinetdrunスナックキットしかし、人には選択権があるツールキットデーモン管理そしてカリフォルニア大学、サンディエゴ)次のように:

#!/空/ノッシュ
tcp-socket-listen --numeric-host --backlog 2 --bind-to-any 128.168.1.40 www-http
setuidgidpi
ユーザーエクスペリエンス
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のサービスユニットできる希望の方法でコメントを提示してください。

システムサービスユニットでは、.INIファイルのコメントを使用してスーパーユーザー権限を削除する部分をコメントアウトできます。

;ユーザー=pi
;グループ=パイ
上記の最初のrunプログラムを次のように修正してください。

#!/空/ノッシュ
#setuidgidpi
#userenv
chdir /home/pi/habridge
Java -jar -Dconfig.file=data/habridge.config ./ha-bridge-3.2.2.jar

関連情報