이미 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 사용이 절망적인 분들을 위해 rc
System 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에 바인딩할 수 없다는 것을 의미합니다. 의심할 바 없이 이것이 여러분이 --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 자바 -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