すでに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の使用が絶望的な方のためにrc
System 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にバインドできないことを意味します。疑いなく、これが--chuid
System 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 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