초기화 스크립트가 예상대로 작동하고 시작/중지 기능이 완벽하게 작동하도록 노력 중이지만 상태 기능이 예상대로 작동하도록 할 수 없습니다. 실행 중: 배포자 ID: Debian 설명: Debian GNU/Linux 7.6(wheezy) 버전: 7.6 코드명: wheezy
이것은 내 초기화 스크립트입니다.
#! /bin/sh
### BEGIN INIT INFO
# Provides: graylog-collector
# Required-Start: $network $named $remote_fs $syslog
# Required-Stop: $network $named $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Graylog Collector
# Description: Graylog's open source log shipper
### END INIT INFO
# Process name ( For display )
NAME="graylog-collector"
# Daemon name, where is the actual executable
DAEMON="/etc/graylog-collector/bin/graylog-collector"
# DAEMON args
DAEMON_OPT="run -f /etc/graylog-collector/config/collector.conf"
# User to run the deamon
DAEMON_USER="graylog-collector"
# pid file for the daemon
PIDDIR="/var/run/$NAME"
PIDFILE="$PIDDIR/$NAME.pid"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
test -x $DAEMON || exit 0
. /lib/lsb/init-functions
d_start () {
log_daemon_msg "Starting system $NAME Daemon"
if [ ! -e $PIDDIR ] ; then
mkdir $PIDDIR
chown ${DAEMON_USER}:${DAEMON_USER} $PIDDIR
fi
start-stop-daemon --background --start \
--user $DAEMON_USER \
--chuid $DAEMON_USER \
--make-pidfile \
--pidfile $PIDFILE \
--startas /bin/bash -- -c "exec $DAEMON $DAEMON_OPT >> /var/log/graylog-collector/console.log 2>&1" || return 2
sleep 2
log_end_msg $?
}
d_stop () {
log_daemon_msg "Stopping system $NAME Daemon"
start-stop-daemon --stop --retry 5 --quiet --user $DAEMON_USER
rm -f $PIDFILE
log_end_msg $?
}
case "$1" in
start|stop)
d_${1}
;;
restart|reload|force-reload)
d_stop
d_start
;;
force-stop)
d_stop
killall -q $NAME || true
sleep 2
killall -q -9 $NAME || true
;;
status)
status_of_proc "${PIDFILE}" "$DAEMON" "$NAME" && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|force-stop|restart|reload|force-reload|status}"
exit 1
;;
esac
exit 0
감사해요.
업데이트 1: 다음 함수를 생성하여 추악하지만 작동하는 솔루션(적어도 작은 요구 사항에 대해서는)으로 스크립트를 업데이트했습니다.
do_status () {
if { ps -U ${DAEMON_USER} ; } >/dev/null 2>&1 ; then
log_success_msg "${NAME} is running"
return 0
else
log_failure_msg "${NAME} is not running"
return $?
fi
}
그런 다음 호출하십시오.
status)
#status_of_proc "${PIDFILE}" "$DAEMON" "$NAME" && exit 0 || exit $?
do_status
;;
답변1
내 이해에 따르면 "${PIDFILE}"과 함께 -p를 사용해야 합니다. 즉, "set -e"를 사용하지 않는 한 init.d 스크립트에서 프로세스를 확인하기 위해 -p를 사용하면 안 됩니다. 제 생각에는 작동하지 않을 것 같습니다. 마지막으로 다음을 시도해 보세요.
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;